Jump to content

Discorpio

Members
  • Content count

    159
  • Joined

  • Last visited

Community Reputation

1 Comum

1 Follower

About Discorpio

  • Rank
    O Senhor é meu Pastor e nada me faltará (Sl. 23:01)
  • Birthday 11/17/1958

Informações Pessoais

  • Sexo
    Masculino
  • Localização
    Rio de Janeiro
  1. Discorpio

    Liberar Form da Memoria!

    Só uma pequena correção, nesse código: ... ... ... if not FileExists(Path) then begin Rewrite(Arq); Append(Arq); end; ... ... ... // Corrigir tirando o operado NOT, assim: ... ... ... if FileExists(Path) then begin Rewrite(Arq); Append(Arq); end; ... ... ... Um abraço Jorge da Silva Abreu
  2. Discorpio

    Liberar Form da Memoria!

    Boa tarde a todos. Caio Mancini, só agora entendi o que voce quer fazer, na verdade voce está criando componentes dinamicamente dentro do Form frmRegTes, e quer salvar o Form junto com estes componentes criados para poder recuperá-los mais tarde. Se isto é possível ?, pois é possível sim, para fazer isto, voce terá que mexer com um arquivo que tem o nome da Unit do seu Form e com a extensão .DFM (Delphi Form), pois este arquivo contém a configuração do seu Form escrita mais ou menos assim: object Form2: TForm2 Left = 331 Top = 322 Align = alCustom BorderStyle = bsDialog ClientHeight = 92 ClientWidth = 341 Color = clSkyBlue Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] FormStyle = fsStayOnTop OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object lblPrompt: TLabel Left = 8 Top = 8 Width = 53 Height = 13 Caption = 'lblPrompt' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentFont = False end object MaskEdit: TMaskEdit Left = 8 Top = 24 Width = 329 Height = 24 CharCase = ecUpperCase Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False TabOrder = 0 end object btnOK: TBitBtn Left = 72 Top = 56 Width = 75 Height = 25 TabOrder = 1 OnClick = btnOKClick Kind = bkOK end object btnCancel: TBitBtn Left = 200 Top = 56 Width = 75 Height = 25 TabOrder = 2 OnClick = btnCancelClick Kind = bkCancel end end Os Arquivos *.DFM, se não me falhe a memória, até o Delphi 5, eram arquivos binários. A partir do Delphi 6 estes aquivos, muito embora continuando com a extensão .DFM, passarão a ser do tipo Texto. Qual foi a vantagem disto? Isso é ótimo na verdade para sistemas de controle de versão. Se tenho um form com 100 componentes o DFM vai ficar gigante, com centenas de linhas. Se eu mudo apenas um componente de lugar no form, mesmo que seja um componente não visual, o DFM é atualizado. Em casos como esse, apenas uma ou duas linhas do DFM são alteradas. Se ele estiver no formato texto, os sistemas de controle de versão mais inteligentes como o SubVersion armazenam apenas as modificações realizadas de uma revisão para outra, ou seja, uma ou duas linhas. Se o arquivo é binário, ele não consegue comparar, e tem que copiar novamente o arquivo inteiro para seu repositório. Isto proporcionou uma economia enorme Mas outra grande vantagem é que as versões do seu DFM também poderão ser comparadas por softwares que comparam código fonte, e você poderá ver com facilidade as mudanças em propriedades dos seus componentes de uma versão para outra. Graças a isso, o Delphi disponibilizou duas funções que converte de binário para texto (ObjectBinaryToText(Input: TStream, Output: TStream)), e vice e versa (ObjectTextToBinary(Input: TStream, Output: TStream)). Assim voce pode transformar o seu arquivo texto (possível *.DFM em um componente). Vamos a código. Voce vai declarar as duas funções de conversão e implementá-las assim: type TfrmRegTes = class(TForm) .... .... btnGravaComp: TButton; procedure btnGravaCompClick(Sender: TObject); private { Private declarations } function ComponentToString(Component: TComponent): string; function StringToComponent(Value: string): TComponent; public { Public declarations } end; var frmRegTes: TfrmRegTes; implementation {$R *.dfm} procedure TfrmRegTes.btnGravaCompClick(Sender: TObject); var Arq: TextFile; Path: String; begin // Supondo que o nome da Unit do frmRegTes seja RegTes Path := ExtractFilePath(Application.ExeName) + 'RegTes.dfm'; AssignFile(Arq, Path); if not FileExists(Path) then begin Rewrite(Arq); Append(Arq); end; Self.Visible := False; write(Arq, ComponentToString(Self)); CloseFile(Arq); Self.Close; end; function TfrmRegTes.ComponentToString(Component: TComponent): string; var BinStream:TMemoryStream; StrStream: TStringStream; s: string; begin BinStream := TMemoryStream.Create; try StrStream := TStringStream.Create(s); try BinStream.WriteComponent(Component); BinStream.Seek(0, soFromBeginning); ObjectBinaryToText(BinStream, StrStream); StrStream.Seek(0, soFromBeginning); Result:= StrStream.DataString; finally StrStream.Free; end; finally BinStream.Free end; end; function TfrmRegTes.StringToComponent(Value: string): TComponent; var StrStream:TStringStream; BinStream: TMemoryStream; begin StrStream := TStringStream.Create(Value); try BinStream := TMemoryStream.Create; try ObjectTextToBinary(StrStream, BinStream); BinStream.Seek(0, soFromBeginning); Result := BinStream.ReadComponent(nil); finally BinStream.Free; end; finally StrStream.Free; end; end; .... .... { Aqui, a final da Unit, voce vai ter que registrar a classe dos componentes recém criados, que no seu caso são os TRadioButton, assim: } initialization RegisterClass(TRadioButton); end. Só devo te alertar que tenha muito cuidado quando voce mexer com os arquivos *.DFM, pois eles contém as configurações do seu Form, tanto até que quando voce acessar o Form pela segunda vez, o Delphi lhe questionará se voce quer manter a atualização anterior, responda que não. Repare que muito embora eu não esteja utilizando a função StringToComponente (..., ....), pois creio eu que voce não irá precisar por enquanto, porém já estou te enviando o código e para quando futuramente voce queira recuperar algum componente que tenha gravado o seu código como texto, isto é, para o caso de voce quiser grava somente os componentes TRadioButton ou qualquer outro componente, pois no caso do form não irá precisar. Para recuperar o arquivo componente texto, o código é esse: procedure TForm4.btnRecuperaCompClick(Sender: TObject); var Comp: TComponent; Arq: TextFile; Linha, CompStr: String; begin CompStr := ''; AssignFile(Arq, 'NomeComponente.txt'); Reset(Arq); while not Eof(Arq) do begin ReadLn(Arq, Linha); CompStr := CompStr + linha + #13; end; CloseFile(Arq ); Comp := Form3.StringToComponent(CompStr); if Comp is TRadioButton then TRadioButton(Comp).Parent := Self; end; Um abraço Jorge da Silva Abreu
  3. Discorpio

    Liberar Form da Memoria!

    Bom dia Caio Mancini Então neste caso, teste o FreeAndNil lá dentro do Bloco Finally, assim: procedure TfrmTeste.RegistrarTestes1Click(Sender: TObject); begin try Application.CreateForm(TfrmRegTes,frmRegTes); //cria o form frmRegTes.ShowModal; //mostra o form finally FreeAndNil(frmRegTes); //libera o form da memória end; end; Para te dizer a verdade, eu também sempre desconfiei do método Free, pois acredito que ele destroi o Objeto mas não limpa a Instância, ou seja, a Instância fica fazendo referência a um objeto inexistente na memória. Como assim ? Todo Objeto é uma instância (variável) na memória, porém essa instância (variável) não armazena o objeto em si, e sim a posição (referência) de memória onde o objeto está armazenado, e por isso que acredito, muito embora ainda com dúvidas, de que o método Free destrói o objeto mas não limpa a instância (variável). Se não fosse assim, porque criaram o método FreeAndNil(Nome da Instância) ? Só para te lembrar, se for utilizar o código acima, então aborte o uso da destruição do Form no Evento OnClose do mesmo, se não voce vai tentar destruir o mesmo Form duas vezes, e isto gera erro. Um abraço Jorge da Silva Abreu
  4. Discorpio

    Liberar Form da Memoria!

    Boa noite a todos. Ao Thales.Saraiva: O método Release, presente na classe TCustomForm, serve somente para em caso de erro crítico ocorrido dentro de um Form qualquer, voce utilizá-lo que um destrutor recursivo do Form, ou seja, se ele é uma ação recursiva, ele tem que ser invocado de dentro do próprio Form que será destruído. O método Release, além de destruir o Form, ele primeiro atualiza todas as mensagens de API dos componentes no Form contido, bem como do próprio Form e depois destroi o próprio Form, assim sendo, atribuir o valor Nil a sua instância posteriormente é desperdício de recurso, pois voce está atribuindo Nil a uma Instância que já destruída. Ao Caio M S Mancini. Meu caro Caio, voce também está fazendo desperdício de recurso. Como assim ? Ou voce utiliza esta código, em sistemas SDI é claro: procedure TfrmTeste.RegistrarTestes1Click(Sender: TObject); begin try Application.CreateForm(TfrmRegTes,frmRegTes); //cria o form frmRegTes.ShowModal; //mostra o form finally frmRegTes.Free; //libera o form da memória end; end; ou voce pode usar este tanto em sistemas SDI como em MDI (Aliás, em MDI voce só pode utilizar este). procedure TfrmRegTes.FormClose(Sender: TObject; var Action: TCloseAction); begin //fecha o form e libera memória FreeAndNil(frmRegTes) // Esta opção é a mais eficiente // ou action:=caFree; end; Para abrir Forms em sistemas MDI, o recomendável é que voce só utilize uma linha de código assim: Application.CreateForm(TfrmRegTes,frmRegTes); Repare que voce também estava tentando destruir o mesmo Form duas vezes, e isto provavelmente gera a exceção de erro, pois como voce pode tentar liberar da memória uma instância que já foi destruída ? Se voce pretende recuperar um form que foi fechado, então não o destrua da memória, apenas feche-o sem que o Evento OnClose esteja configurado para destruí-lo, quando voce cria o Form em memória, ele fica lá enquanto a aplicação estiver rodando, mesmo que ele esteja fechado. Voce pode também utilizar o método Hide do Form, que este o esconde sem destruí-lo, como se estivesse fechado. A única incoveniência disto é que se voce estiver com digamos 450 forms em memória, isto pode acarretar uma sobrecarga de memória, e ocasionar um estouro de pilha (Stack overflow). Um abraço
  5. Discorpio

    Apresente-se...

    1) Quem é Você? Jorge da Silva Abreu, sou funcionário público estadual da Secretaria de Administração Penitenciária do RJ, lotado na Acessoria de Informática da mesma, sou casado, tenho dois filhos, a minha filha mais velha tem 18 anos e filho mais novo tem 10 anos, rapaz !!! estou ficando velho, estou com 50 anos e quase aposentado, porém para a TI não pretendo me aposentar, pois prefiro programar no computador, do que ficar nas praças jogando sueca ou buraco com os amigos, melhor é jogar paciência no computador. 2) Do que Gosta? Esportes (Futebol, Basketbal e Voley), Cinema, da Tecnologia da Informação (Hardware e Software), e principalmente, é claro, de Mulher. 3) Programa a Quanto Tempo ? Comecei com linguagem Basic num console adaptável a TV chamado TK95, passei depois para o MSX da gradiente, e depois para os PC-XT, onde aprendi MBasic, Clipper e depois o COBOL, tudo isto de 1986 a 1989. Hoje em dia estou aprendendo a programar em Java. 4) Porque escolheu Delphi ? Quando conheci o Delphi, já tinha algumas noções de VB, porém vinha estudando noções de Orientação a Objetos, foi quando me apresentaram o Delphi, e este afinal, foi o responsável pelo meu divórcio do VB 5) Como conheceu o Fórum iMasters ? Navegando na Web em busca de dicas. 6) O Que o levou a se cadastrar ? Ajudar a quem precisa, pois sempre gostei que me ajudassem quando estava aprendendo, aliás, as dúvidas aqui postadas serão para mim uma espécie de simbiose, ou seja, também será o meu aprendizado. 7) O Que espera do Fórum ? Que tal fazerem um arquivo de Help do tipo 1001 dicas sobre Delphi, Java, PHP e etc. das melhores resposta. 8) MSN, GTalk, E-mail, Skype... e Afins...? discorpio@msn.com discorpio@gmail.com
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.