
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Testei sua rotina e para funcionar ficou como segue. (troquei o nome das variáveis para ficar mais legível, ok?!) procedure TForm1.RichEdit1Change(Sender: TObject); var PosNaLinha, PosNoTexto, IdxLinha, SavedPos :integer; begin SavedPos := richedit1.SelStart; // salva posição atual do cursor PosNaLinha := 0; PosNoTexto := 0; for IdxLinha := 0 to richedit1.Lines.Count -1 do begin PosNaLinha := pos('VAR', UpperCase(richedit1.Lines[IdxLinha])); if PosNaLinha > 0 then begin Inc(PosNoTexto, PosNaLinha -1); richedit1.SelStart := PosNoTexto; richedit1.SelLength := 3; richedit1.SelAttributes.Style := [fsBold]; Inc(PosNoTexto, 3); richedit1.SelLength := 0; richedit1.SelStart := PosNoTexto; richedit1.SelAttributes.Style := []; Inc(PosNoTexto, Length(richedit1.Lines[IdxLinha]) -PosNaLinha); richedit1.SelStart := SavedPos; // posição do cursor, visto que a cada tecla esta rotina é chamada end else Inc(PosNoTexto, Length(richedit1.Lines[IdxLinha])+2); // +2 é para somar os #10#13 end; end; Dê uma olhada neste componente (link - procure por RichEdit Syntax Highlighter 3.2). Tem os fontes junto, talvez você possa aproveitá-los para sanar suas dúvidas.
-
O primeiro link retornado leva você direto a documentação ref. a MIDI (link)Este outro vai direto para a seção Window Multimidea (link) ... Dei mais uma pesquisado e encontrei um componente que talvez lhe ajude no que você quer TMidiGen (link)
-
Se não estou enganado, adicione um ... E eu estava enganado. Agora, dando uma olhada nesta pendência, verifiquei em loco nos meus relatórios: Corrigindo meu post anterior (May 24 2006, 04:00 PM): - Adicione um QRBand (por default ele será criado com BandType = rbTitle) e troque a propriedade BandType para rbGroupFooter; - Coloque neste Group Footer o seu QRExpr que faz o sum ou count (o que você fazia no sumary) e na propriedade ResetAfterPrint selecione True; - Selecione o Group Header do post anterior (May 23 2006, 12:52 PM) e na propriedade FooterBand, selecione o Group Footer recém adicionado; []s
-
O que você está querendo fazer é extender os recursos da IDE do Delphi. Isto pode ser feito. Entretando, a menos que você seja um desenvolvedor de componentes onde este recurso aumentaria sua produtividade, acredito que você preferirá continuar digitando os comandos, visto que pode ser um pouco complicado e aricar a estabilide da IDE. Um livro que dá uma boa base para isto é "Hidden Paths of Delphi 3", não sei se há uma versão para as IDE's recentes (D7, D8, 2005...). Houveram alterações internas que podem não permitir o uso integral do que é ensinado no livro. Quando migrei para a versão 7 do Delphi, precisei fazer apenas alguns ajustes em nomes de units que foram modificadas para que meu plug-in continuasse funcinando. Se não tiver dificuldade com Inglês este link aponta para diversos arquigos relacionados ao assunto Este outro artigo utiliza parte do que você deseja ter em seu recurso - o pressionamento de uma combinação de teclas no editor do delphi para que ele acione um procedimento (link) No artigo de GUSTAVO CHAURAIS (link), Open Tools API (zipado) você encontra vários exemplos de uso de OTA (OPen Tools API). Por fim, basta procurar pelo tópico delphi open Tools API no Google que você encontrará mais referências. []s
-
1) Ordenar o resultado da sua consulta por Cidade 2) No seu relatório coloque um componente QRGroup (será seu GroupHeader) e: - Configure a propriedade Expression com o nome do campo Cidade (algo como: suaquery.CIDADE); - altere a propriedade ForceNewPage para True; (se você quizer a impressão de uma cidade por página) - Coloque nele um QRDBText apontando a proipriedade DataSet para sua consulta (query) e DataField para o campo Cidade. obs: Esta banda será impressa uma única vez para cada Cidade que for encontrada em sua consulta 3) Adicione um componente QRBand e modifique a propriedade BandType para rbDetail e: - Coloque nele três QRDBText apontando a proipriedade DataSet para sua consulta (query) e DataField para o campo Nome. obs: esta banda se repetirá para cada linha (Nome) que for encontrado na tabela para a cidade apresentada na GroupHeader
-
(Resolvido) Criar Indices Primarios E Secundarios Via Codigo
pergunta respondeu ao Eder de Micheus em Delphi, Kylix
Elder, dê uma olhada neste código (link) com atenção para a parte posterior ao texto { adiciona a chave primária e três secundárias} p.s. só lembrando que é Micheus e não Michels. :D -
Sim. Se eu entendi, o layout da tabela é algo como: Estilo | Código | Data ============================ 1 10 10/05/2006 2 6380 15/05/2006 3 351 13/05/2006 Então, em seu ComboBox você adiciona na propriedade Items: Semanal, Quinzenal e Mensal. A propriedade ItemIndex irá lhe dizer qual das opções está selecinada, porém, como esta propriedade começa a contar de zero, você precisará adicionar 1 para posiconar corretamente no Estilo em sua tabela. Assim, se etá selecionado Mensal, ComboBox1.ItemIndex retornará 2, que na sua tabela corresponderá a 3. Mas se você não for obrigado a iniciar o campo Estilo a partir de 1, sugiro que você utilize o valor direto do ItemIndex, ou seja, comece de zero pois ficaria mais simples o acesso.
-
basta que ao invés de você adicionar (insert ou append) um novo registro, você atualize (edit) o último que está lá. Deste modo haverá sempre um único registro na tabela. (considerando, é claro, que se a tabela estiver vazia, você terá que fazer o 1º insert nela)
-
Agora que você postou esse código, queria exclarecer que a sugestão que dei anteriormente baseava-se na possibilidade de você estar utilizando um Loockupfield (acho que é isto) no seu dataset, o que faz com que um um combobox seja automaticamente criado dentro do seu DBGrid. Mas vejo que não era o caso. No momento não poderei lhe ajudat, aqui onde estou não tenho o D7 então não lembro de cabeça os detalhes.
-
A função Locate não exige um índice. De qualquer forma, para o seu caso, parece-me que você possa fazer algo como: procedure TForm1.PosicionaLinha(NumLinha :integer); begin SQLClientDataSet.DisableControls; SQLClientDataSet.First; while NumLinha > 0 do begin SQLClientDataSet.Next; Dec(NumLinha); end; SQLClientDataSet.EnableControls; end;e então chamar de algum lugar. Obs: o DisableControls, caso você não o tenha utilizado antes, evita que o DBGrid seja atualizado enquanto você está movendo o cursor da sua consulta.
-
Vamos ver se consigo melhorar a resposta. Cada linha do DBGrid corresponde a um registro do seu SQLClientDataSet (a maior parte dos componentes de acesso a tabelas em banco, descendem de TDataSet, acredito que seja o mesmo caso para SQLClientDataSet). Assim, cada vez que você mover uma posição no seu SQLClientDataSet (através de Next ou Prior) você notará que o registro selecionado no DBGrid acompanhará a movimentação. Como você disse que gostaria de posicionar a seleção em uma determinada linha no DBGrid, suponho que você saiba, de alguma forma, para qual linha você deseja ir. Eu imagino que seja baseado no valor de algum campo, então você poderia tentar o seguinte: SQLClientDataSet.Locate('CODIGO', Codigo, []); onde considero que a busca seja pelo campo 'CODIGO', com o valor Codigo e a busca deve ser pelo valor exato []. Dê uma espiada no help sobre a função Locate. (principalmente se utilizar mais de um campo para a busca)
-
E se você utilizar o evento OnChange do field referente ao estado (field do dataset utilizado no DBGrid) e usar o valor deste campo para filtrar a query que você, provavelmente, utiliza como loockup para cidade? Não resolveria?
-
uma vez que seu DBGrid está ligado a uma tabela ou query, você deve utilizar um dos métodos de posicionamento de registros destes componentes para que a respectiva linha no DBGrid seja selecionada. No caso de TTable poderia ser através de Locate, FindKey (se não me engano) e para o TQuery seria Locate.
-
Bom, como parece que não chegamos a alguma conclusão sozinhos, resolvi pesquisar um pouco e podemos verificar o que já foi postado em outros forums. Forum DevMedia => link e atenção especial a este artigo da Borland => link *** para adiantar: "Linux uses POSIX file semantics, which lets us modify, delete, and rename a file that is already in use and not locked. But Win32 doesn't let us do that kind of stuff! It's all very complicated, but the bottom line is that Linux lets us write self-modifying executables, but Win32 doesn't." Acho que isto encerra a questão da escrita no exe por ele próprio - no Windows não dá mesmo. []s
-
Opção 1: ---------------------------------------------------------------------- NO CAMPO--COLUNAS--TAMANHO--FORMATO--DESCRIÇÃO------ ---------------------------------------------------------------------- CODIGO... 01 A 05 05 POS. 99999 CÓDIGO DE LANÇ. NOME..... 06 A 25 20 POS. LIVRE NOME DO CLIENTE CIDADE... 26 A 35 10 POS LIVRE NOME DA CIDADE UF....... 36 A 37 02 POS. LIVRE SIGLA DO ESTADO ----------------------------------------------------------------------- Opção 2:----------------------------------------------------------------------- INFORMAÇÃO----------CI----CF-----FORMATO--------------EXEMPLO---------- ----------------------------------------------------------------------- CODIGO LANCAMENTO 01 05 99999 00310 NOME 06 25 LIVRE P/ DIGITAÇÃO APOLÔNIO LIMA CIDADE 26 35 LIVRE P/ DIGITAÇÃO BLUMENAU UF 36 37 LIVRE P/ DIGITAÇÃO SC Acho que a 2ª opção fica mais clara e mais parecida com as do exemplo da DataPrev. Sim e acho que deve fazê-lo em documento apropriado explicando como interpretar tais informações, como ocorre no referido link (O formato dos arquivos para a importação segue uma regra muito simples. Cada informação deve...) []s p.s. O macete para linhar o texto utilizando code é contar as posições na mão - não adianta alinhar na tela pois o fonte do editor não tem tamanho fixo - por isso ainda ficou bagunçado.
-
O intúito não era de convencer ninguém. Mas se não está claro sugerindo procedimentos, as vezes ver o código pode ajudar. Aqui mesmo no forum, vê-se alguns questionamentos pouco claros e, na tentativa de ajudar, é costume solicitar "posta o código ai". Sinto muito. :(
-
Desculpe, no último upload esqueci de torná-lo público. Está lá agora
-
Acabei escrevendo um exemplo do que eu estava falando (comentado linha a linha), acredito que ficará mais claro agora: link obs: Execute inicialmente o arquivo LeEXE.exe. Então depois utilize o GravaEXE.exe para gravar os valores. []s
-
Acho que o colega confundiu-se, eu apenas fui o último a postar uma dica. A dica a que você se refere é de altoria do colega Arlon conforme link []s
-
Talvez a resposta esteja no help. Procure por "ShareMem unit", para maiores detalhes, mas de ante-mão, quando você exporta funções ou procedimentos que recebem com parâmetros strings longas ...bla,bla... você deverá incluir esta unit na DLL (e deverá ser a primeira da cláusula uses) e no projeto que a utilizar. E neste caso ainda será necessário levar com o programa a DLL DELPHIMM.DLL (Delphi Memory Management). Claro, se esta for a resposta ao seu problema. []s
-
Quebra de linha só vai existir se você gravá-la ao final das strings. Para que o notepad a interprete, por exemplo, basta concatenar um #10 ou #13 (eu sempre me confundo qual dos dois ele considera). Já se for visualizar no Edit (programa DOS), precisará inserir os dois #10#13 (acho que nesta seqüência). Observe que o notepade é um editor de textos e, como tal, ele carregará o arquivo até encontrar o EOF (#16 se não me falha a memória) do arquivo. Como você adiciona suas variáveis ao final do arquivo e, se não estou enganado, ele ficará após este caracter. Motivo pelo qual acredito que você deva posicionar (seek) no final do arquivo utilizando o endereçamento a partir do início do mesmo na posição FileSize(nomearquivo). Só para não complicar muito as coisas, eu costumo no processo de gravação: - gravo cada variável no final do arquivo; - somo o nº de bytes que as variáveis vão ocupando, no arquivo; - gravo no arquivo este valor em seguida (normalmente do tipo word); - gravo o identificador no final do arquivo, utilizando um string stático tipo: const Identify :string[3] = '@MX'; Para fazer a leitura: - inicializar uma variável PosFile com FileSize(nomearquivo) -SizeOf(Idenfy); - posicionar (FileSeek) em PosFile e ler para IdentifyAux(string[3]) a quantidade de bytes SizeOf(Idenfy); - testar se IdentifyAux = Identify, constatando que já existe a informação no fim do arquivo; - existindo, decrementar de PosFile o SizeOf(Word) e ler a quantidade de bytes ocupados pelas variáveis numa variável CountSize (aqui temos exatamente a posição de onde devemos começar a lê-las); - decrementar de PosFile o valor de CountSize de modo que agora PosFile estará apontando para a posição da qual deverão ser lidos os valores das variáveis. - ler cada variável conforme foi gravada... Eu acredito que as coisas estão se complicando um pouco. Como disse antes, o executável não terá como se modificar, logo, acho as outras abordagens mais proveitosas e simples: Armazenar em BD, arquivos .ini ou registro do windows. []s
-
Thales, ao ler seu post das 10:50, ia mesmo perguntar como é que você estava conseguindo escrever no próprio programa Mas, no seu último post percebi que ainda não estava conseguindo. O motivo exato para que isso seja impossível eu não sei, até tenho uns palpites, mas você já deve ter observado que tentar excluir ou mover um arquivo/programa (no windows explorer) que esteja em uso é impossível. Aqui, até vejo uma vantajem sobre o armazenamento no registro do windows, já que o arquivo .ini pode ser facilmente transportado para outras máquinas.Sobre o uso da string dinâmica, tem como inconveniente de não ficar registrado no arquivo o seu tamanho. Costumo, pelo menos, armazenar esta informação também, pois facilita as coisas. O exemplo postado (abaixo) nã está armazenando nem o terminador da string (#0) o que pode dificultar sua recuperação. FileWrite(f,ch^,length(st)); deveria ser: FileWrite(f,ch^,length(st)+1); Da minha parte só posso dizer: não se iluda, no meu caso é que hoje em dia não trabalho mais exclusivamente com programação (é uma segunda opção).
-
Como você pretende interagir com outra empresa utilizando arquivo com campos de tamanhos fíxos, o normal é utilizar os campos alinhados pela esquerda. Se você vai determinar como receberá estes dados, você pode optar ainda pelo uso do formato CSV. Sim, na verdade uma definição do layout e se possível um exemplo. Procurei na net e encontrei um exemplo deste tipo de definição -> link (role uma página para baixo no início). Já havia notado. ;)
-
Se entendi direito, faça o seguinte: - Adicione o ComboBox no seu form; - Altere a propriedade Style para csDropDownList; - Sugiro que sua query retorne os registros ordenados pelo nome da tarefa; - considerando que seu componente TQuery chame-se QTarefas e que os campos na tabela sejam DSC_TAREFA e COD_TAREFA, no evento OnCreate do seu form coloque: procedure TForm1.FormCreate(Sender: TObject); begin ... QTarefas.Open; while not QTarefas.EOF do begin // adiciona a descrição e o código da tarefa na lista ComboBox1.Items.AddObject(QTarefasDSC_TAREFA.AsString, Pointer(QTarefasCOD_TAREFA.AsInteger)); QTarefas.Next; end; QTarefas.Close; if ComboBox1.Items.Count > 0 then ComboBox1.ItemIndex := 0; // posiciona no primeiro item ... end; Quando você precisar saber o que está selecionado utilize: - Codigo da tarefa selecionada: Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]) - Descrição da tarefa selecionada: ComboBox1.Items[ComboBox1.ItemIndex]
-
sua tabela deve ter um índice para este campo (definida em ordem crescente) o qual deve estar selecionado utilizando a propriedade IndexName ou IndexFieldName (se estiver utilizando um TTable p.e.). Caso esteja utilizando um TQuery (ou similar), deve incluir a cláusula ORDER BY <campo desejado>. E ESTE AQUI está CORRETO ASSIM??se você estiver utilizando o método que o Churc postou, então está correto (considerando que você concatenou cidade e uf), porém não aconselho utilizar o caraceter espaco como delimintador, visto que os nomes próprios podem conter este caracter e no momento da leitura, quando você porcura pelo delimitador, pode obter resultados inesperados.Já se estiver utilizando a abordagem de tamanho fixo que coloquei (utilizando ":" - que alinha pela direita) e considerando: código(5), nome(7), cidade(8) e uf(2), então observe que você deveria visualizar algo como: 00001 EDERLIBLUMENAUSC 00002 MARIO BRUSQUESC 00003CLAUDIO INDAIALSC obs: apenas utilizando code (no editor aqui do site) é que os caracteres são mantidos do mesmo tamanho, facilitando a observação adequada. se você precisa de tamanho fixo e alinhado pela esquerda, então deverá fazer diferente. Deverá utilizar uma função que complete o texto até o tamanho desejado. Vou colocar uma aqui uma função que faz isto, caso você já não tenha uma:function FixeSize(Source :String; Size :Integer) :String; var SourceSize :Integer; begin Result := Copy(Source, 1, Size); // Trunca se for maior SourceSize := Length(Result); while SourceSize < Size do begin inc(SourceSize); Insert(' ', Result, SourceSize); end; end; daí, o seu código ficaria algo assim:procedure TForm1.Button3Click(Sender: TObject); Var F: TextFile; begin ... Writeln(F, FixeSize(Table1.FieldByName('Codigo').Value, 5), // use AsString caso Codigo seja numerico FixeSize(Table1.FieldByname('Nome').Value, 20), FixeSize(Table1.FieldByname('Cidade').Value, 10), FixeSize(Table1.FieldByname('uf').Value, 2)); Table1.Next; ... end;