Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Encontrei por acaso um artigo que ensina como criar um componente não-visual (derivado de TComponent) que pode receber mensagens do Windows e como achei que pode ser útil postei aqui. A idéia do artigo é criar uma janela oculta (hidden window) para o componente através da utilização da função AllocateHWnd (é mais ou menos isto) -> link
  2. Se a sugestão do colega Thales de armazenar em um banco não for apreciada (tem vantagens como facilidade na manipulação e poder ser compartilhada a outros usuários) e você tem o desejo de manter os dados para cada execução do seu programa, eu vejo alguns inconvenientes no método apresentado (apesar de já ter utilizado deste artifício em certa oportunidade): - cada vez que você recompilar o programa (uma nova versão) a informação se perderá; - se você precisar adicionar mais campos, deverá adiconar uma rotina de "conversão" no seu programa auxiliar, para ler no formato antigo, adicionar os novos campos e gravar os dados no novo "formato" no programa principal. Acredito que uma boa solução seria você pode optar por colocar num arquivo .INI (mais vulnerável) ou armazenar nas chaves de registro do windows (um pouco mais seguro), visto que: - As informações não se perderiam com uma nova versão do programa; - O controle das informações a serem armazenadas ficaria num único programa; - A inclusão/exclusão de novos campos também ficariam mais tranquilas.
  3. A forma como o Churc, colocou é a mais "econômica" em termos de espaço e mais prática sendo normalmente conhecida como CSV (Comma Separated Value - valor separado por vírgula), aqui o Churc utilizou um ponto-e-vírgula. Já a opção que você postou, pelo modo de leitura do txt, é a "menos econômica" - os valores são armazenados com tamanhos fíxos o que torna a leitura mais simples, mas tem o inconveniente de que o tamanho dos campos devem ser conhecidos. No seu exemplo, se for utilizado algum artifício para armazenar no txt os dados com o tamanho que você espera ler (observe que você concatenou os dados na gravação sem formatar o tamanho dos compos e, no entando, espera lê-los em posição e tamanhos fixos), você poderá utilizar a rotina de leitura como está implementada. O procedimento Write/Writeln permite que você formate a saída (veja help), de modo que utilizando :n (onde n é o tamanho do campo) logo após o conteúdo a ser impresso, ele será completado com espaços para completar o tamanho especificado. Assim, no procedimento em que você grava no arquivo txt acrescente a formatação e no procedimento que você lê o txt utilize o Trim para remover espaços extras colocados, conforme abaixo - teste: procedure TForm1.Button3Click(Sender: TObject); Var F: TextFile; begin ... Writeln(F, Table1.FieldByName('Codigo').Value:5, Table1.FieldByname('Nome').Value:20, Table1.FieldByname('Cidade').Value:10, Table1.FieldByname('uf').Value:2); Table1.Next; ... end; procedure TForm1.Button2Click(Sender: TObject); var Txt : TextFile; Entrada : String; begin ... Table1.Insert; Table1.FieldByName('Codigo').Value := Trim(Copy(Entrada,01,05)); Table1.FieldByName('Nome').Value := Trim(Copy(Entrada,06,20)); Table1.FieldByName('Cidade').Value := Trim(Copy(Entrada,26,10)); Table1.FieldByName('UF').Value := Trim(Copy(Entrada,36,02)); Table1.Post; ... end;
  4. da VCL seriam StdCtrls e ExtCtrls (sem o "que")Se você criar componentes derivados dos existentes, utilizando a opção do menu->Component->New Component, em Ancestor type você verá que os componentes usuais possuem duas "versões" uma contida nas bibliotecas da VCL e outra na CLX (aparece o tal do "que" no nome das mesmas que está entre parenteses). Se você pressionar F1 encima da classe ancestral, no seu caso TLabel, irá verificar que aparecem duas opções para você escolher: CLX Reference ou VCL Reference. []s
  5. A idéia era algo como está abaixo, porém não está resultando no esperado. Quem sabe algum outro colega agora possa dar alguma idéia para resolver este problema. (desculpe não poder ajudar mais) procedure TForm1.Button1Click(Sender: TObject); var Handle :HWND; KeyFlag :LongInt; begin Handle := FindWindow(nil, PChar('Prompt de comando'#0)); // Eu abri uma janela do prompt para testar if Handle > 0 then begin if SetForegroundWindow(Handle) then // Ativa janela do prompt do dos begin KeyFlag := (18 shl 15) or // Specifies the scan code (do help WM_KEYDOWN) (1 shl 23) or // Specifies whether the key is an extended key (do help WM_KEYDOWN) (1 shl 29); // Specifies the previous key state. The value is 1 if the key is down (do help WM_KEYDOWN) SendMessage(Handle, WM_KEYDOWN, VK_MENU, KeyFlag); KeyFlag := (13 shl 15) or // Specifies the scan code (do help WM_KEYDOWN) (1 shl 29); // Specifies the previous key state. The value is 1 if the key is down (do help WM_KEYDOWN) SendMessage(Handle, WM_KEYDOWN, VK_RETURN, KeyFlag); KeyFlag := 1 or // Specifies the repeat count. The repeat count is always one for a WM_KEYUP (18 shl 15) or // Specifies the scan code (do help WM_KEYDOWN) (1 shl 29) or // Specifies the previous key state. The value is 1 if the key is down (do help WM_KEYDOWN) (1 shl 30); // Specifies the transition state. The value is always 1 for a WM_KEYUP (do help WM_KEYDOWN) SendMessage(Handle, WM_KEYUP, VK_RETURN, KeyFlag); KeyFlag := 1 or // Specifies the repeat count. The repeat count is always one for a WM_KEYUP (18 shl 15) or // Specifies the scan code (do help WM_KEYDOWN) (1 shl 23) or // Specifies whether the key is an extended key (do help WM_KEYDOWN) (1 shl 29) or // Specifies the previous key state. The value is 1 if the key is down (do help WM_KEYDOWN) (1 shl 30); // Specifies the transition state. The value is always 1 for a WM_KEYUP (do help WM_KEYDOWN) SendMessage(Handle, WM_KEYUP, VK_MENU, KeyFlag); end; end; end;
  6. talvez você possa enviar mensagens do tipo WM_KEYDOWN e WM_KEYUP, através de SendMessage ou SendNotifyMessage, sendo que você deverá ter o handle da janela desejada.
  7. Pois não é que aconteceu a mesma coisa aqui. Fiquei intrigado, ai lembrei que, um dia desses, olhando os itens da paleta via Configure Palette notei que haviam componentes repetidos - mas que não estavam obviamente aparecendo na paleta padrão. Então notei que são aqueles utilizados para aplicações CLX. Daí olhando melhor a cláusula uses observei que você estava derivando de compontes desta bibiloteca (CLX) QStdCtrls e QExtCtrls, enquanto que se fosse as da VCL seriam StdCtrls e ExtCtrls. To postando seu código com algumas alterações extras: 1 - substituiução das units na cláusula uses; 2 - inclusão do destructor; 3 - alteração de owner para self na instanciação do timer, motivo pelo qual foi adicionado o destructor. Se ficasse como estáva, ao adicionar o seu componente no form, você observaria que o timer também aparecerá nele (os dois componentes - experimente); 4 - habilitação do timer apenas se não estiver no modo design-time, caso contrário, assim que você adiciona ele no form o relógio começa a atualizar o label (normalmente não é o que se quer - experimente); unit ULabelTime; interface uses Windows, Messages, SysUtils, Classes, StdCtrls, ExtCtrls; type TLabelTime = class(TLabel) private { Private declarations } protected { Protected declarations } public { Public declarations } Timer : TTimer; constructor create(aowner : TComponent); override; destructor destroy; procedure refresh(sender : tobject); published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TLabelTime]); end; constructor TLabelTime.create(aowner : TComponent); begin inherited create(aowner); Timer := TTimer.Create(Self); Timer.interval := 1000; Timer.OnTimer := refresh; Timer.Enabled := not (csDesigning in ComponentState); if Timer.Enabled then refresh(self); end; destructor TLabelTime.destroy; begin Timer.Free; inherited; end; procedure TLabelTime.refresh(sender : tobject); begin Caption:=TimeToStr(now); invalidate; end; end. []s
  8. Micheus

    Ajuda

    Até onde sei, apenas seria possível restaurar os DFMs, o código seria "impossível". Dê uma olhada neste site (link) onde há maiores exclarecimentos. Boa sorte.
  9. Micheus

    Relatorio

    Se não estou enganado, adicione um QRBand (por default ele será criado com BandType = rbTitle) e troque a propriedade BandType para rbGroupFooter e na propriedade LinkBand selecione aquele Group Header do post anterior. 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. Acho que é isto.
  10. Falta inicializar X. Tipo: procedure TForm6.Button3Click(Sender: TObject); var ContAnabelle, X:Integer; begin ContAnabelle:=0; X := 0; ... Mesmo assim, acho que você não vai conseguir totalizar os votos da forma como você implementou. Observe que as variáveis são locais e inicializadas a cada vez que você clicar no botão. Imagino que você queira que essas variáveis sejam globais e que sejam inicializadas na criação do seu form. Deste modo você não perderá seus valores a cada vez que for clicado no botão e respondido Sim. Também não entendi como é que seu programa compilou com a atribuição abaixo: ReadVotoAnabelle.SelText:=X;
  11. Neste (link) tem um exemplo do que o colega Thales disse.
  12. se quiser postar o código ou mandar por e-mail..., estamos ai.
  13. se você o vê nesta tela, deveria poder ver em qual das paletas ele foi adicionado. Se você selecionar na lista de paletas (à esquerda) a opção [All] e na lista da direita localizar seu componente, a coluna Page lhe indicará em qual paleta ele está.Observe que se você não criou um arquivo .dcr (contendo o ícone) para ele, provavelmente estará utilizando o mesmo icone do TLabel (ou na pior das ipóteses, aquele famoso icone contendo um quadrado azul, um triângulo vermelho e uma esfera amarela)
  14. Micheus

    Pra Quem é Doido

    Bom, disto eu tenho uma vaga idéia, mas acredito que lendo este artigo (link) você poderá entender melhor. []s
  15. por acaso você está registrando o seu compoente? unit suaunit; ... TSeuLabel = class(TLabel) ... end; procedure Register; implementation constructor TSeuLabel.create... ... procedure Register; {Registro do componente} begin RegisterComponents('Standard', [TSeuLabel]); end; end. Dê uma olhada no help em RegisterComponents para maiores detalhes.
  16. Micheus

    Pra Quem é Doido

    Não sei se o termo é este, mas parece-me que seja definição por antecipação. Observe o fragmento do código da unit Classes abaixo: ... TStrings = class; { TGetModuleProc } { Used in the TFormDesigner class to allow component/property editors access to project specific information } TGetModuleProc = procedure(const FileName, UnitName, FormName, DesignClass: string; CoClasses: TStrings) of object; IStringsAdapter = interface ['{739C2F34-52EC-11D0-9EA6-0020AF3D82DA}'] procedure ReferenceStrings(S: TStrings); procedure ReleaseStrings; end; { TStrings class } TStringsDefined = set of (sdDelimiter, sdQuoteChar, sdNameValueSeparator); TStrings = class(TPersistent) private FDefined: TStringsDefined; FDelimiter: Char; FQuoteChar: Char; FNameValueSeparator: Char; FUpdateCount: Integer; FAdapter: IStringsAdapter; ... Na segunda metade do fragmento, a classe TStrings tem uma propriedade FAdapter do tipo IStringsAdapter o qual na primeira metade do fragmento está declarado e utilizando a mesma classe TStrings em sua procedure ReferenceStrings. Note que se não houvesse a declaração antecipada, ao compilar a unit e passando pela declaração de IStringsAdapter ocorreria um erro, pois TStrings ainda não estaria definida. Da forma como foi implementada, o compilador entende que a classe TStrings está definida e não gera erro. Não sei se consegui ser claro. Talvez algum outro colega possa ajudar. []s
  17. No D7, para instalar o DgPrint seria: Menu->Component->Install Component..., na tela que aparece você pode opnar em colocar o componente em um pacote existente (Into existing package) ou em um novo (Into new package) e em Unit file name selecione o arquivo DgPrint.pas (no local onde você o colocou) e no final é só clicar em Ok.
  18. bom, ainda não entendi direito o que você quer fazer, mas se for para alterar todos os registros (linhas) que aparecem no seu DBGrid, inicializando o campo pagamento para pago ou não, você precisará fazer um loop varrendo todos os registros que aparecem no seu DBGrid e inicializando o referido campo. Já se for para inicializar apenas registros selecionados no DBGrid (e daí deve estar habilitada na propriedade Options a seleção múltipla - dgMultiSelect), então terá que varrer as linhas selecinadas através de DBGrid.SelectedRows.Items[idx]; Como não estou certo do que você quer não vou por exemplos.
  19. Micheus

    Relatorio

    veja se isto resulta no que você precisa: 1) Ordenar o resultado da sua consulta por produto 2) No seu relatório coloque um componente QRGroup e: - Configure a propriedade Expression com o nome do campo produto (algo como: suaquery.PRODUTO); - altere a propriedade ForceNewPage para True; - Coloque nele um QRDBText apontando o DataSet para sua consulta (query) e DataField para o campo produto. []s
  20. não seriam todos os registros apresentados no DBGrid do form2? tem um campo que indica que alguma coisa foi paga na tabela associada ao DGBrid, de que tipo seria?
  21. acho que uma maneira simples de você resolver o problema para este seu caso (' / / ' is not a valid date.) seria utilizar: ... if Length(Trim(edDataNasc.Text)) > 4 then // se estiver em branco, o Trim resultará em '/ /' try // se o campo DATANASC for do tipo string em sua tabela, você vai precisar remover o // comentário da linha abaixo (StrToDate), pois o MaskEdit não valida datas e aceita qualquer coisa. // Porém ser o campo DATANASC for do tipo data, a atribuição automaticamente resultará // na conversão de string para data, de modo que se text for inválido haverá uma exceção // StrToDate(edDataNasc.Text); DM1.tb_juizes.FieldByName('DATANASC').AsString := edDataNasc.Text; except // havendo erro, o foco é colocado no MaskEdit e uma mensagem é dada a usuário // através de ShowMessage edDataNasc.SetFocus; ShowMessage('Data inválida!'#10' Digite novamente.'); // Porém, se quizer emitir a mensagem utilizando o diálogo padão para excessões, remova as // duas linhas acima e retire os colchetes que estão comentando o código abaixo { on E:EConvertError do begin edDataNasc.SetFocus; E.Message := 'Data inválida!'#10' Digite novamente.'; raise; end else raise; } end; ... []s
  22. Micheus

    Formatando Valores

    utilize a propriedade DisplyFormat do field de seu dataset(TQuery, TTable, ...). Colocando R$ #,##0.00 será o suficiente para você ter duas cadas após a vírgula e o ponto da milhar juntamente com a representação da moeda.
  23. Sobre o componente TQuickRep, que está em seu form, clique com o botão direito do mouse e na primeira opção do menu pop-up que aparece está o número da versão.Quanto a sua pergunta sobre a compatibilidade, não sei responder embora pareça ser o caso.
  24. Sim. Em design-time, posicione o mouse sobre a linha divisora das colunas no header (linha fixa) e observe que o cursor muda para o de redimensionamento. Daí é só clicar e arrastar. Em run-time, pode utilizar a propriedade ColWidths. Assim, para redimensionar as duas primeiras colunas seria o seguinte: StringGrid1.ColWidths[0] := 40; StringGrid1.ColWidths[1] := 150; ....
  25. Micheus

    Campo Data

    Churc se estiver utilizando D7 por exemplo, não precisa rodar por fora, basta desabilitar este recurso em Tools->Debugger Options->Language Exceptions e desmarcar Stop on Delphi Exceptions. As vezes utilizo isto e então adiciono break-points. Só não convém mantê-lo desabilitado, já que é um bom recurso de depuração. se você fizer, em seu evento, algo do tipo: - DataDigitada (string) = dbedit1.text menos os espaços em branco existentes no final de text - DataAtual (string) = DateToStr(Date) - verificar até onde foi digitada a data no campo DataDigitada, se até a primeira contra-barra ou segunda e daí copiar o que faltou da DataAtual. Acomposição das duas seria atribuida a dbedit1.text. p.s. não estou podendo fazer o código agora, então se a ideia for útil e algun colega puder ajudar...
×
×
  • Criar Novo...