komponenteneditor forms tform property designtime

Rund um die LCL und andere Komponenten
arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

komponenteneditor forms tform property designtime

Beitrag von arturx »

gesucht : Komponenten-Editor, welcher einer property vom typ tform im Objectinspector die passende valuelist spendiert.

Der Versuch :

Code: Alles auswählen

Property xyform : tform read fform write fform
scheiterte : das klappt zwar mit allen anderen Komponententypen, aber leider nicht mit tform
(°PropertyHook.GetComponentNames° reagiert irgendwie nicht auf tform (obwohl tform ja auch vom typ tcomponent ist)
leider habe ich nicht herausgefunden, woran es liegt. Vielleicht kann einer unserer Gurus etwas dazu sagen..(Bitte !!!)

Was kann ich machen, um auch die Forms als Listeneintrag zu bekommen ?

ArturX
Zuletzt geändert von arturx am Mo 1. Mär 2010, 11:08, insgesamt 2-mal geändert.

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms designtime

Beitrag von arturx »

Nun habe ich mittlerweile eine Lösung gefunden, die vielleicht für den einen oder anderen hilfreich sein mag :
(function GetAttributes: TPropertyAttributes; habe ich weggelassen, damit es nicht ganz so lang wird)

Code: Alles auswählen

tlinkedformProp = class(tpropertyEditor)//TcomponentPropertyEditor)
  protected
  public
      procedure GetValues(Proc: TGetStringProc);      override;
      function  GetValue : AnsiString;                override;
      procedure SetValue(const NewValue: ansistring); override;
  end;
//............................................
function tlinkedformProp.GetValue: AnsiString;
     var pers     : tpersistent;
         obj      : tobject;
         propinfo : ppropinfo;
  begin  result := '';
         pers   := getcomponent(0);  //formconnector
         If not (assigned(pers) and (pers is tcomponent))
            then exit;
         propinfo :=  typinfo.GetPropInfo(pers.ClassInfo,getname);
         If assigned(propinfo) then
            begin obj := typinfo.GetObjectProp(pers,propinfo);
                  If assigned(obj) and (obj is tform)
                     then result := (obj as tform).name;
            end;
end;
//..............................................
procedure tlinkedformProp.SetValue(const NewValue: ansistring);
      var pers     : tpersistent;
          propinfo : ppropinfo;
          fo       : tcustomform;
   begin
          pers   := getcomponent(0);  //formconnector
          If not (assigned(pers) and (pers is tcomponent))
             then exit;
          propinfo :=  typinfo.GetPropInfo(pers.ClassInfo,getname);
          If assigned(propinfo) then
             begin fo := screen.FindForm(newvalue);
                   typinfo.SetObjectProp(pers,propinfo,fo);
             end;
   end;
//...............................................
procedure tRainformConnectlinkedFormProp.GetValues(Proc: TGetStringProc);
      var i  : integer;
          st : string;
   begin
         For i := 0 to screen.FormCount-1 do
           begin
               st := trim(Uppercase(screen.forms[i].name));
               If (st='')                      OR
                  (st='OBJECTINSPECTORDLG')    OR
                  (st='SOURCENOTEBOOK')        OR
                  (st='SYNBASECOMPLETIONFORM') OR
                  (st='MAINIDE')               OR
                  (st='PROJECTINSPECTOR')      OR
                  (st='MESSAGESVIEW')          OR
                  (st='LAZFINDREPLACEDIALOG')
                  then system.continue;
               proc(screen.forms[i].Name);
           end;//for
    end;
Was mich noch ziemlich stört ist das "Bereinigen" der Forms in getvalues.
Außerdem werden nur die zur design-time schon geöffneten Formulare dargestellt
(Die anderen müssten aber auch irgendwie erreichbar sein, denn über F12 kann ich ja darauf zugreifen)

Wie kann man allgemeingültig feststellen,
welche Forms zum Project gehören bzw. welche zur Application gehören ?

Hat irgendjemand eine Idee ???
Zuletzt geändert von arturx am Mo 1. Mär 2010, 10:38, insgesamt 2-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponenteneditor forms designtime

Beitrag von pluto »

Unter Application.Froms gibt es eine Liste.... vielleicht hilft das weiter.
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms designtime

Beitrag von arturx »

Wahrscheinlich meinst Du "application.components".
Während der runtime funktioniert das prächtig, aber zur designtime ist dort nur "mainide" bekannt....
Leider, Leider..... :(

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponenteneditor forms designtime

Beitrag von pluto »

application.components
Nein. Ich meinte wirklich application.froms.

Aber es gibt auch einen Komponenten Style. csDesing oder so ähnlich. So könntest du alle Froms Abfragen und fest stellen, ob es sich im Desingtime befindet. Such mal nach ControlStyle bzw. ComponentStyle. Da müsste es was geben.

Das From ist immer die letzte Komponente. An sich gibt es keinen Grund, warum das im OI zu Problemen führen sollte.
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms designtime

Beitrag von arturx »

pluto hat geschrieben:Nein. Ich meinte wirklich application.froms.
Hilfe ! ! !
irgendwie habe ich ein Brett vor dem Kopf.
wie komme ich an "application.froms" ???
Als application-Methode oder property finde ich es nicht.
Gibt es evt. ein 2.Application Object mit dieser Eigenschaft....... :?:

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: komponenteneditor forms tform property designtime

Beitrag von _X_ »

pluto hat geschrieben:Nein. Ich meinte wirklich application.froms.:
Ich denke das ist ein Tipp Fehler
Müsste Application.Forms heißen.

mfg _X_

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponenteneditor forms tform property designtime

Beitrag von pluto »

Als application-Methode oder property finde ich es nicht.
Du musst die Unit Froms einbinden. Dann steht dir das Applications-Objekt zur Verfügung.
Alle Froms du du erstellst landen in dieser Liste bzw. sollten. Vielleicht hilft das weiter.
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms tform property designtime

Beitrag von arturx »

Hey Pluto,
vielen herzlichen Dank für die schnelle Antwort.
nach vielem Suchen :
1.die unit "froms" gibt es nicht auf meinem System:
weder in den packages noch ist ein froms.* mit dem Win-Explorer zu finden

2.in Forms (nicht froms) finde ich zwar screen.forms bzw. screen.customforms,
aber bei application finde ich kein property form, forms oder Ähnliches

Bitte gib mir eine Idee, ob meine Einwände s.o. richtig sind oder was ich tun (evt. downloaden) muss,
um Deine Tips nutzen zu können.

Während der Designtime findet man das gesuchte Verhalten via Shift-F12 : dort werden alle Formulare angezeigt,
egal ob sie schon erzeugt sind oder nicht. Wo ist das programmiert ? Wer weiß das ?
Ich bin gespannt auf Eure Ideen.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: komponenteneditor forms tform property designtime

Beitrag von monta »

Schau mal in der main.pas (unter /ide) bei ungefähr Zeile 8530.

Dort wird dein Shift+F12 verarbeitet:

Code: Alles auswählen

function TMainIDE.SelectProjectItems(ItemList: TStringList;
  ItemType: TIDEProjectItem; MultiSelect: boolean): TModalResult;
//...
      // add all form names of project
      if Project1.Units[i].ComponentName <> '' then
      begin
        if (ItemType = piComponent) or
           ((ItemType = piFrame) and (Project1.Units[i].ResourceBaseClass = pfcbcFrame)) then
          ItemList.AddObject(Project1.Units[i].Unit_Name,
            TViewUnitsEntry.Create(Project1.Units[i].ComponentName, i,
                                   Project1.Units[i] = ActiveUnitInfo));
//...
Johannes

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms tform property designtime

Beitrag von arturx »

Johannes, ich bin beeindruckt !
Nach kurzer Suche fand ich main.pp unter \IDE.
Es scheint genau das zu sein, was ich suche.
Aber:
Ich wollte zum Testen main einbinden, das wollte der Compiler jedoch nicht.
Wie kann man Tmainide einbinden ?
Ich denke, dass ich zu wenig über das IDE-Interface weiß.
Gibt es eine Art "quick und dirty" Info für den Einstieg ?
Rainer

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponenteneditor forms tform property designtime

Beitrag von pluto »

2.in Forms (nicht froms) finde ich zwar screen.forms bzw. screen.customforms,
aber bei application finde ich kein property form, forms oder Ähnliches
Du hast recht, die gibt es nicht. Ich bin mir sehr sicher das es sowas mal gegeben hat, vielleicht unter Delphi ?
Ich wollte zum Testen main einbinden, das wollte der Compiler jedoch nicht.
Wie genau ist die Fehler Meldung ? Hast du versucht die Unit in der zweiten Uses Klausel einzubinden ?
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms tform property designtime

Beitrag von arturx »

pluto hat geschrieben:Wie genau ist die Fehler Meldung ? Hast du versucht die Unit in der zweiten Uses Klausel einzubinden ?
Ich habe main in die Registrierunit meiner Componente eingebunden, direkt in die 1.Uses clause.
(ich versuche mögl. immer mit der Standard uses clause auszukommen,
da uses clauses im implementation Teil imo nur zu verstärktem Spaghetti führen)
danach kam die lapidare Meldung : can't find unit main used by uformconnectReg
Da ich mich bis jetzt noch nicht intensiv mit der IDE-implementierung auseinandergesetzt habe
- außer bei der normalen Komponenten Erstellung-
wußte ich nicht, welchen Pfad ich ergänzen sollte :
Hilfe ist gern willkommen !!!!!!!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponenteneditor forms tform property designtime

Beitrag von pluto »

Ich nehme an, dass sich diese Unit unter : Dein Lazarusverzeichns\ide befinden sollte
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponenteneditor forms tform property designtime

Beitrag von arturx »

pluto hat geschrieben:Ich nehme an, dass sich diese Unit unter : Dein Lazarusverzeichns\ide befinden sollte
wie ich oben geschrieben hatte : ich hatte die unit main.pp gefunden,nur müsste wahrscheinlich
irgendein Compiler Suchpfad oder ein projektsuchpfad darauf gesetzt werden.
Außerdem : da das Ganze in einer Komponenten Eigenschaft genutzt werden soll, müsste main.pp im Package verfügbar sein.
Wie geht das ? In welchen anderem Package finde ich main.pp (dann wäre der Pfad automatisch da)
oder wo stelle ich welchen Pfad ein ??
Grüße Rainer

Antworten