Results 1 to 9 of 9

Thread: dfm property left / top

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    dfm property left / top

    Ik ben bezig een datamodule te converteren d.m.v. code. (Dat scheelt me straks een maand klikken in de objectinspecor). Stream naar dfm.
    Ik maak een nieuw component (dataset) aan. Is het mogelijk @runtime de designtime property Left + Top te zetten?

  2. #2
    Welke routine gebruik je daarvoor?
    De TStream.WriteComponent(const Instance: TComponent) schrijft n.l. wel ook al een Left/Top in de string (naar de stream) voor designtime-componenten.

    De makkelijkste oplossing is dus:
    *) In die stream kun je daarna dus de Top/Left toevoegen.

    Als je verder even in de source duikt zul je zien dat er intern voor elk (T)Component een FDesignInfo bijgehouden wordt.

    In de WriteComponent() wordt deze dan ook aangesproken:

    Delphi Code:
    1. procedure TComponent.DefineProperties(Filer: TFiler);
    2. var
    3.   Ancestor: TComponent;
    4.   Info: Integer;
    5. begin
    6.   Info := 0;
    7.   Ancestor := TComponent(Filer.Ancestor);
    8.   if Ancestor <> nil then Info := Ancestor.FDesignInfo;
    9.   Filer.DefineProperty('Left', ReadLeft, WriteLeft,
    10.     LongRec(FDesignInfo).Lo <> LongRec(Info).Lo);
    11.   Filer.DefineProperty('Top', ReadTop, WriteTop,
    12.     LongRec(FDesignInfo).Hi <> LongRec(Info).Hi);
    13. end;

    FDesignInfo zelf is public.
    Delphi Code:
    1. property DesignInfo: TDesignInfo read FDesignInfo write FDesignInfo;

    Dus:
    Delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var
    3.   IB1: TIBQuery;
    4.   NewDesignInfo: LongRec;
    5. begin
    6.   IB1 := TIBQuery.Create(nil);
    7.   NewDesignInfo.Hi := Word(100);
    8.   NewDesignInfo.Lo := Word(200);
    9.   IB1.DesignInfo := Longint(NewDesignInfo);
    10.   ShowMessage(ComponentToStringProc(IB1));
    11. end;


    Geeft:
    Code:
    object TIBQuery
      BufferChunks = 1000
      CachedUpdates = False
      ParamCheck = True
      Left = 200
      Top = 100
    end

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Thanks. Misschien kan ik met jouw voorbeeld verder!
    Ik gebruik (uit een help voorbeeld van delphi) onderstaande routine.
    Code:
    function ComponentToStringProc(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;

  4. #4
    Quote Originally Posted by EricLang View Post
    Ik gebruik (uit een help voorbeeld van delphi) onderstaande routine.
    Dat is inderdaad met TStreamer.WriteComponent().

    Quote Originally Posted by EricLang View Post
    Thanks. Misschien kan ik met jouw voorbeeld verder!
    Dat moet dan dus wel lukken.

    Je kunt er ook even een aparte routine van maken:

    Delphi Code:
    1. procedure SetTopLeft(Comp: TComponent; ATop, ALeft: Integer);
    2. var
    3.   NewDesignInfo: LongRec;
    4. begin
    5.   NewDesignInfo.Hi := Word(ATop);
    6.   NewDesignInfo.Lo := Word(ALeft);
    7.   Comp.DesignInfo := Longint(NewDesignInfo);
    8. end;
    9.  
    10. //...
    11. SetTopLeft(Jouw_component, 100, 200);

    Of zelfs integreren in je ComponentToStringProc():

    Delphi Code:
    1. function ComponentToStringProc(Component: TComponent; Top, Left: Integer): string;
    2. var
    3.   BinStream:TMemoryStream;
    4.   StrStream: TStringStream;
    5.   s: string;
    6.   NewDesignInfo: LongRec;
    7. begin
    8.   NewDesignInfo.Hi := Word(ATop);
    9.   NewDesignInfo.Lo := Word(ALeft);
    10.   Component.DesignInfo := Longint(NewDesignInfo);
    11.   BinStream := TMemoryStream.Create;
    12.   try
    13.     StrStream := TStringStream.Create(s);
    14.     try
    15.       BinStream.WriteComponent(Component);
    16.       BinStream.Seek(0, soFromBeginning);
    17.       ObjectBinaryToText(BinStream, StrStream);
    18.       StrStream.Seek(0, soFromBeginning);
    19.       Result:= StrStream.DataString;
    20.     finally
    21.       StrStream.Free;
    22.     end;
    23.   finally
    24.     BinStream.Free
    25.   end;
    26. end;

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    GREAT! Ik laat hier weten wat de resultaten zijn :-)

  6. #6
    Ik ben wel een beetje nieuwsgierig waarom je in runtime de designtime properties wilt zetten. Ga je weer nieuwe dfm's genereren vanuit je code? Anders zie ik niet hoe dat nuttig kan zijn..
    1+1=b

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Dat is het. Ik heb nu TSQLQuery + TDataProvider + TClientDataSet. Deze moeten vervangen worden door TFDQuery. In 30 a 40 schermen volgestouwd met datasets.
    Dat doe ik runtime door de datamodule te creeeren en een TFDQuery aan te maken. Deze neemt de diverse properties inclusief velden over. Daarna free ik de dbExpress componenten, rename de FDQuery en maak dan een nieuwe DFM aan.
    Ook parse ik daarna nog de bijbehorende pas-file.
    Natuurlijk in een kloon van het gehele project. Het is de snelste - en slimste denk ik :-) - manier om het bulk-werk geautomatiseerd te doen.
    Out of the box idee.

  8. #8
    Quote Originally Posted by EricLang View Post
    Dat doe ik runtime door de datamodule te creeeren en een TFDQuery aan te maken.
    Waarom niet gewoon alles dan ook runtime aanmaken in je code? Waarom heb je nog een visuele designtime module nodig?

    Ik regel dat soort dingen liever in code zodat je ook sneller aanpassingen maakt (als je toch met een framework bezig bent).

  9. #9
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ja dat klopt. Ik ben een @runtime-fan. Maar dan ben ik *veel* teveel tijd kwijt met het ombouwen van het programma. De bedoeling is in eerste instantie zoveel mogelijk intact te houden en DbExpress uit te faseren.
    Natuurlijk hebben de mensen in het verleden alles in elkaar geklikt. Dus forms / controls verwijzen @designtime naar de datamodules / datasets / fieldnames :-(

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •