Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TReader (unit Classes), ungültiger Eigenschaftswert (https://www.delphipraxis.net/191524-treader-unit-classes-ungueltiger-eigenschaftswert.html)

hoika 24. Jan 2017 16:37

TReader (unit Classes), ungültiger Eigenschaftswert
 
Hallo,
ich schaue mir gerade einen Quellcode an.
Ziel des Codes ist es, eine DFM-Datei (genauer einen Teil) zu laden und in einem Formular anzuzeigen.

Die Datei sieht wie folgt aus.
object Scrollbox1: TScrollBox
Left = 0
Top = 0
Width = 769
Height = 519
VertScrollBar.Range = 515
Align = alLeft
AutoScroll = False
TabOrder = 1
ExplicitHeight = 470
object Button1: TButton
Left = 0
Top = 0
Width = 732
Height = 515
OnClick = Button1Click
end
end

Und hier ein Teil des Codes.

Delphi-Quellcode:
Procedure StringToComponent(AOwner, AParent: TComponent; Value: string;
                            OnClass: TFindComponentClassEvent; prog: TReadComponentsProc;
                            ReadError: TReaderError; SetName: TSetNameEvent);
var BinStream, StrStream:TMemoryStream;
    Writer: TWriter;
Begin
  if Length(Value)> 0 then
  Begin
    BinStream:= TMemoryStream.Create;
    StrStream:= TMemoryStream.Create;
    try
      StrStream.SetSize(Length(Value));
      StrLCopy(StrStream.Memory,PChar(Value),StrStream.Size);
      while StrStream.Position < StrStream.Size do
        ObjectTextToBinary(StrStream, BinStream);
      Writer:= TWriter.Create(BinStream, 16);
      try
        Writer.WriteListEnd;
      finally
        Writer.Free;
      end;
      BinStream.Seek(0, soFromBeginning);
      with TReader.Create(BinStream, 4096) do
      Begin
        try
          OnFindComponentClass:= OnClass;
          OnSetName:= SetName;
          OnError:= ReadError;
          ReadComponents(AOwner, AParent, Prog);
          BinStream.Seek(0, soFromBeginning);
        finally
          Free;
        end;
      end;
    Finally
      FreeAndNil(BinStream);
      FreeAndNil(StrStream);
    end;
  end;
end;
Das klappt auch alles ganz gut, solange ich das OnClick weglasse.
Mit dem OnClick kommt "ungültiger Eigenchaftswert".

Wie bekomme ich denn dem TReader irgendwie die Methoden beigebracht?


Hintergrund:
Ich will sowas wie einen eigenen Object-Inspector bauen,
um dynamische Forms zu konstruieren.
Das Speichern klappt ja auch (ausser OnClick) und das Laden halt nicht.


Danke im voraus.

Uwe Raabe 24. Jan 2017 16:47

AW: TReader (unit Classes), ungültiger Eigenschaftswert
 
Du könntest mal versuchen, den OnFindMethod- oder OnFindMethodInstance-Event zu verdrahten. Es genügt vielleicht schon dort einfach nil oder bzw. (Code: nil; Data: nil) zurückzugeben und Error auf false zu setzen.

himitsu 24. Jan 2017 17:09

AW: TReader (unit Classes), ungültiger Eigenschaftswert
 
Jupp, OnFindMethod :angle:

Der TReader sucht eigentlich in der Instanz der Root-Komponente (meistens die Form) nach den Event-Methoden, sowie nach verlinkten Komponenten.
Entweder du gibst irgendwo im Reader diesen "Parent" an oder du mußt selber suchen.

Alternativ ganz böse den "Code" für deine Root-Komponente vor und hint diesem Codeschnipsel anhängen.

hoika 24. Jan 2017 17:36

AW: TReader (unit Classes), ungültiger Eigenschaftswert
 
Hallo,
ah, das mit den TForm-Suchen benutzen klingt doch chon mal ganz gut.

Der Bsp.-Code ist etwas "verworren" ;)

Da war auch ein TForm lokal erzeugt und als Owner bzw. Parent angegeben.
Mal weiter probieren, aber nicht mehr heute *nach Hause schlurf*.


Ich melde mich zu Fort- / Rückschritten.

So, doch noch mal gestartet in der Tat hat das ursprüngliche Form genau diese Methode ;)
dann bin ich morgen ja mal etwas schlauer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz