
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
se isto é uma pergunta, você define a ordenação pelo índice criado, através da propriedade IndexName ou IndexFieldNames do seu dataset tipo Table. por esse "há há" deve-se julgar que você está satisfeito. Não?! Então, é uma opção - a escolha é sua. ;) Abraços
-
Pretinha, seguindo o código que o Churc postou (com alguns ajustes), ficaria assim: var s: String; i1, i2: Integer; CheckWord :boolean; Ch :Char; begin i2 := 0; // inicializa com 0 o contador s := Memo1.Lines.Text; i1 := Pos(LowerCase(Edit1.Text), LowerCase(s)); if i1 = 0 then ShowMessage('Não foi encontrada a palavra: "' + Edit1.Text + '"') else while i1 > 0 do begin if i1 > 1 then // se não está no início do texto begin move(s[i1-1], ch, 1); // obtém o caracter antes da palavra CheckWord := not (Ch in ['a'..'z', 'A'..'Z']); end else // é a primeira palavra no texto CheckWord := True; delete(s, 1, i1 +Length(Edit1.Text) -1); if s <> '' then // se não chegou ao fim do texto... begin move(s[1], ch, 1); CheckWord := CheckWord and not (Ch in ['a'..'z', 'A'..'Z']); end else // chegou ao fim do texto CheckWord := True; if CheckWord then Inc(i2, 1); i1 := Pos(LowerCase(Edit1.Text), LowerCase(s)); end; if i2 > 0 then ShowMessage('Número de palavras encontradas: ' + IntToStr(i2)); end;após encontrada a posição da palavra, é verificado o caracter que a precede e o que a sucede. Não sendo qualquer letra do alfabeto, consideramos que é válida. Observe que já no outro código, o contador i2 deveria iniciar em 0 e não em -1, pois, ao encontrar a primeira ocorrência da palabra, o contador teria o valor 0 (zero) o que não estaria correto.
-
deio, É como o Churc disse, tem coisas que são muito específicas e poucos usam. Mas, como eu lhe sugeri o uso do "componente", andei dando uma olhada nele e, como era de esperar e o Churc mencionou , há um exemplo completo na pasta Demo. Neste caso, você tem como dar uma fuçada e retirar apenas o que você precisa dele. O demo é baseado na versão em C disponível na Micro$oft (link). Este é o link correto, já que o que consta na pasta Demo não aponta para ele e acusa erro. Também está disponível a documentação sobre o WAB no msdn. Boa sorte.
-
Desculpe a demora num retorno. A idéia seria basicamente a seguinte: type TForm1 = class(TForm) ... private OldCol, OldRow :Integer; ... end; ... implementation ... // após a edição de uma célula, salvamos a posição (será a da última célula editada) procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Longint; const Value: string) begin OldCol := ACol; OldRow := ARow; end; // move o foco para a última célula editada procedure TForm1.BtnUltimaCelulaEditada(Sender :TObject); begin StringGrid1.Col := OldCol; // posiciona na última coluna editada StringGrid1.Row := OldRow; // posiciona na última linha editada StringGrid1.EditorMode := True; // Coloca grid em modo de edição end; É conveniente que você inicialize as variáveis (no momento mais conveniente - talvez a cada vez que o cara definir uma nova função), por ex. com -1 e antes de mover o foco, você testa este valor para saber se é válido ou não.
-
O que o Churc quiz dizer é que você define uma variável local ao seu form para armazenar a imagem carregada. Daí, quando você precisar resetar ela, você não precisa carregar ela novamente, mas sim ler desta variável.Seria algo mais ou menos assim: type TForm1 = class(TForm) ... private Picture :TPicture; end; ... implementation ... // na criação de seu form, aloca uma instância do objeto TPicture procedure TForm1.Form1Create(Sender :TObject); begin Picture := TPicture.Create; ... end; // na destruição do form, você libera a memória alocada ao objeto TPicture procedure TForm1.Form1Destroy(Sender :TObject); begin ... Picture.Free; end; // quando você carrega a imagem - neste ex. através de um botão // você atribui seu conteúdo para a variável Picture procedure TForm1.btnCarregaImagemClick(Sender :TObject); begin Image1.Picture.LoadFromFile('nome_da_imagem.bmp'); Picture.Assign(Image1.Picture); end; // ao resetar a imagem, você atribui o conteúdo da variável Picture - imagem salva procedure TForm1.btnResetImagemClick(Sender :TObject); begin Image1.Picture.Assign(Picture); end;
-
piaulino, acho que seria conveniente você colocar o cabeçalho da sua função, como você a declarou. ________________ pialino, com esta última informação que você postou, eu deu uma pesquisada e acredito que este Update (Microsoft) deva ser levado em conta. Observe a parte que refere-se exatamente ao erro que você mensiona. Apesar de não estarmos falando de VB, mas se a criação da conexão envolve o uso de CreateObject (utilizando OLE/COM...) pode ser a origem do seu problema. Abraços
-
Veja que aqui você definiu como índice o campo Código - sem problemas. Aqui vemos que sua "navegação" ocorrerá sobre uma tabela ordenada pelo campo Código - sem problemas. Aqui, se não estou interpretando errado o que você colocou, temos um problema. Voce está ao mesmo tempo utilizando o mesmo dataset para duas coisas: inserção/edição e lookup. Quando você utiliza o lookup, o dataset de onde são obtidos os dados da lista (ListSource) devem ser provenientes de outro dataset que não o utilizado no DataSource ou qualquer outro que venhamos a manipular (no seu caso o DataSource do DBGrid). Posto as observações acima, para fazer isto o que você precisa é, como já mencionei nos outros posts, utilizar um outro dataset para a propriedade ListSource, com ordenação pelo campo Palavra. Pode ser um outro Table, mas você precisará criar um índice secundário pelo campo Palavra e selecioná-lo em IndexName deste dataset. Ou, poderá utilizar uma query, ordenando pelo campo através da cláusuala ORDER BY e, neste caso, você precisará estar atendo ao fato de que, após cada inclusão ou alteração do dataset principal, você precisará fechar e abrir esta query para que a lista seja atualizada. Este comentário de um post anterior seu: Voce ainda pretende utilizar um edit para posicionar o lookup? Há uma dúvida ainda. Parece-me que você quer selecionar no DBLookupComboBox e posicionar o registro no DBGrid. É isto mesmo? Se for, após a seleção de um item no lookup, você utiliza o valor em KeyValue para posicionar o DBGrid, através de FindKey do dataset ligado ao DBGrid.
-
você não tem o ListSource ordenado pelo campo palavra? Que tipo de dataset você tem nesta propriedade, Table ou Query?
-
Ao invés de testar State por gdFocused, utilize gdSelected (if gdSelected in State then). Assim você estará testando a linha (registro) selecionada.
-
O colega HDELPHI não gostaria de registrar-se como um membro de nosso grupo?
-
Sim Não. Esta propriedade indica que tecla ao ser pressionada, limpa o conteúdo de KeyValue, desfazendo a seleção. Ela é uma propriedade não publicada (published), ou seja, não está disponível em desing-time via Object Inspector - você a utiliza em run-time (na linha de código). Uma olhadinha no help já resolveria. ;) este valor seria um dos existentes na sua lista (aquela no ListSource). Se você digitar no edit 'bananas' e ela existir na sua lista, ao atribuí-la à KeyValue, seu LookupComboBox deverá ser posicionado nesta palavra (por conseguinte, o registro no dataset em ListSource, o que resultará em mostrar no Memo os significados outrora cadastrados) eu fiz isso mas a palavra continua indo pro final da lista e não entra uma e outraSe a ordem é alfabética, isto não tem lógica - há algo errado. - Que tipo de dataset você ligou ao DBGrid? Table ou Query? - Está indo para o fim da lista? Voce fala do DBGrid?
-
[resolvido] Dúvida Sobre Objects Do Stringgrid
pergunta respondeu ao McBlade de Micheus em Delphi, Kylix
McBlade, é meio chato sim, mas se buscar na net, é capaz de achar um componente que já faça isto. Se você utiliza D7, a título de exemplo, dê uma olhada neste componente - NextGrid. Eu já havia citado ele lá na sessão de Links. No canto inferior esquerdo da janela você vai achar um demo, dê uma olhada no que ele tem. É um StringGrid lindo de se ver. Mas como nem tudo é perfeito e por esta versão ser gratuita, não tem justamente opção para botão. :( Abraços -
Daniel, veja este post. É exatamente sobre este assunto. Qualquer dúvida, dê um retorno. Abraços
-
Poderia ajudar, saber que banco é este, já que você terá que lê-lo de algum modo. Acho que você poderia começar com este outro post - o conceito é o mesmo. Abraços
-
Para o caso de uso de dataset do tipo query (tipo o TQuery), sua resposta está correta Churc. Entretanto, se o colega estiver utilizando um dataset do tipo table (como o TTable), então esta ordenação se dá através do uso de índice criados baseados no campo desejado. Dependendo o banco de dados e componente, este índice é criado dinamicamente, não sendo necessária a criação explícita do índice. Como sempre, um pouco mais de informação ajudaria muito. <_<
-
Churc, acho que o que o colega Hudson Cavazin quer, ele vai conseguir se colocar no evento OnEnter ao invés do OnClick.
-
Bom, para que você posicione a lista do DBLookupListBox, a propriedade KeyValue do mesmo deve receber o valor a ser pesquisado. Mas, não estou certo de que você conseguirá fazer buscas parciais com esta abordagem - teria que dar uma abaliada. Não é problema, uma vez que o datasource do DBMemo é o mesmo do DBLookupListBox (propriedade ListSource), ao posicionar na lista, automaticamente o memo mostrará o respectivo valor. se entendi direito, o fato de você definir um índice na tabela, para o referido campo, resolverá este problema. Pelo que você postou inicialmente, você tem apenas o índice primário (pelo campo Codigo - aquele com o "*"). Voce precisará criar um índice secundário, utilizando o campo "Palavra" e no seu programa, você utiliza a propriedade IndexFieldNames ou IndexName para selecionar este índice. Abraços
-
É interessante que ela tenha resolvido deste modo, porque tenho a impressão que ao remover do resource, o programa apresentará o icone padrão do Windows (aquele quadradinho branco com uma barrinha azul - janela). E se esta era a intensão, bastava utilizar na linha de código: Application.Icon.FreeResouce; Em todos os casos... Abraços
-
Nicole, recomendo que você post sua dúvida na seção Segurança, onde tratam de assuntos deste tipo. Aqui tratamos de dúvidas sobre programação. Não formate seu HD sem ter certeza do que há de errado. ;)
-
Eu diria, pouco comum.Até encontrei um Web Hosting, aqui no Brasil, que oferece planos com o Firebird (http://www.kinghost.com.br/planos.php#). Tem que levar em conta também que ele é "recente" (meados de 2000, derivado do IB6 aberto), enquanto o MySQL vem desde 1980 - acho que vai ser difícil ganhar algum terreno nesse setor. Mas, sem sombra de dúvidas, o mais comum é encontrar Apache +PHP +MySQL.
-
Sonia Didone, melhor seria você postar a parte do código onde você faz as inserções.Já conferiu se a propriedade Size do field está de acordo com o tamanho do campo no banco de dados?
-
Talvez você tenha que processar o desenho da janela para conseguir isso. Dê uma olhada neste link, lá pelo meio da página tem um código que faz isso (ou parte).
-
deio, assim você "me quebra"!!!Eu coloquei o que podemos chamar de um pseudo-código. Este nome_classe, é o nome da classe que você está criando, seja ela TDBGrid, TTabSheet, TButton, T.... Vai depender do seu programa, eu só dei a idéia - não o código pronto! <_< Ótimo! Isso deve resolver sim. Eu é que sugeri algo muito amplo/avançado, desculpe. Abraços
-
vms, a visualização no grid vai ficar mesmo desta forma: '(memo)'; Há meios de contornar isto, se você manipular o desenho da célula do DBGrid.Só acho que do ponto de vista de busca pode ficar um pouco complicado utilizando o tipo memo. Nesta questão, uma palabra será sinônimo da outra e se você vai cadastrar o significado como um memo, não será simples obter o contrário - digitar uma palavra que encontra-se no memo e achar seu sinônimo no campo Palavra. Não sei se me expressei corretamente. Abraços
-
deio, vou dar uma dica que não é a melhor do mundo mas é bem simplista, mas pode envolver alguns ajustes. Crie uma variável do tipo TStringList, a cada classe de objeto instanciado, verifica na lista se a classe existe. Se existe você poderá obter o número do próximo; Se não existe, você poderá incluí-la. Utilize neste caso a propriedade Objects para armazenar o contador. O exemplo a seguir pode ajudar a entender: var Idx :Integer; CompNum :LongInt; CompList :TStringList; begin Idx := StringList.IndexOf(nome_classe); if Idx = -1 then begin CompNum := 0; Idx := StringList.AddObjects(nome_classe, Pointer(CompNum)); // inicializa com o primeiro válido, neste caso 1 end; CompNum := LongInt(StringList.Objects[Idx]); // obtém número na lista Inc(CompNum); // gera novo StringList.Objects[Idx] := Pointer(CompNum); // guarda o novo número <componente>.Name := <componente>.ClassName +IntToStr(CompNum); ... end; Talvez, como conveniência, fosse interessante prefixar o nome da classe com alguma coisa (tipo um 'MyDBGrid', 'MyButton', ...), porque isso evitaria qualquer conflito de nome com os componentes que você possa ter adicionado em design-time. Outra solução, com um custo de processamento maior, digamos assim, seria desenvolver um algorítmo para varrer a lista de componentes (Form.Components) verificando a Classe do componente (se de acordo com a que você quer inserir), e obtendo o número que ao final do seu nome foi adicionada. Devem ser verificados todos os componentes, por isso acho mais custoso. Abraços