Prozeduren/Methoden suchen

Für Fragen rund um die Ide und zum Debugger
Antworten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Prozeduren/Methoden suchen

Beitrag von braunbär »

Ich versuche gerade, die genauen Unterschiede zwischen den beiden Konstrukten Application.CreateForm und Form.Create herauszufinden. Nachdem das nirgends richtig dokumentiert ist (zumindest habe ich nichts gefunden), möchte ich mir die entsprechenden runtime-Quellcodes anschauen.

Gibt es in der IDE irgend eine Möglichkeit, ohne langes Suchen zur "implementation" einer Prozedur oder Methode zu kommen? Ich komme zwar mittels alt-hoch direkt zur Deklaration in der Interface section, aber von dort weg beginnt die Sucherei, weil die Implementierung von sehr vielen Methoden (wie z.B. auch von createform) dann sogar in einer anderen Datei steht als die Deklaration in der Interface-section. Natürlich komme ich mit einem externen tool (wie grep) auch hin, aber vieleicht gibt es ja eine Möglichkeit, so etwas auch mit normalen Lazarus-Bordmitteln zu finden.

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: Prozeduren/Methoden suchen

Beitrag von wp_xyz »

Mit SHIFT+CTRL+PfeilAuf/Ab springt man zwischen interface-Deklaration und Implementation hinundher, auch wenn letzteres in einer inc-Datei ist. Mit einem Häkchen vor "Direkt zu Methodenrump springen" bei "Werkzeuge" > "CodeTools" > "Allgemein" gelangst du bei Prozeduren/Funktionen direkt in den Implementation-Abschnitt.

Wichtig ist auch die Tastenkombination CTRL+B im klassischen Tastaturlayout bzw. ALT-Links im Default-Tastaturlayout, um zur letzten Code-Stelle zurückzuspringen (SHIFT+CTRL+B bzw. ALT+Rechts kehrt die Sprungrichtung um).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Prozeduren/Methoden suchen

Beitrag von mse »

Application.CreateForm() reserviert zuerst den Speicher und setzt die Instantvariable und macht erst danach weitere Aktionen. Das heisst, in TMainForm.Create() ist die Variable MainForm bereits gesetzt, was bei

Code: Alles auswählen

 
var
 MainForm: TMainForm;
[...]
 MainForm:= TMainForm.Create(Application);
 

nicht der Fall ist.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Prozeduren/Methoden suchen

Beitrag von braunbär »

wp_xyz hat geschrieben:Mit SHIFT+CTRL+PfeilAuf/Ab springt man zwischen interface-Deklaration und Implementation hinundher

Danke, der Shortcut ist wirklich sehr hilfreich, nicht nur hier

mse hat geschrieben:Application.CreateForm() reserviert zuerst den Speicher und setzt die Instantvariable und macht erst danach weitere Aktionen. Das heisst, in TMainForm.Create() ist die Variable MainForm bereits gesetzt, was bei ... nicht der Fall ist.

Verstehe - das ist aber einer sauberen Programmierung nicht unbedingt dienlich.
In einer Methode sollte man doch zum Ansprechen der Instanz prizipiell self verwenden und nicht eine globale Variable - auch wenn die Instanz im Programm wahrscheinlich nur einmal erzeugt wird. Die Variable Mainform hat meines Erachtens im Create nichts verloren - besser, es knallt gleich, wenn man das macht, als man handelt sich potentielle Probleme in der Zukunft ein.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Prozeduren/Methoden suchen

Beitrag von mse »

Im TForm create Vorgang wird auch das Formular geladen und je nach geladenen Komponenten verschiedenste On*-Events aufgerufen. Anwender schätzen es, wenn sie auf die Formularinstanz unde deren Komponenten zugreifen können und nicht den "Sender" Parameter typecasten und sich über die "Owner" Eigenschaften hoch hangeln müssen. Es gibt auch events ohne "Sender" Parameter oder wo "Sender" keine TComponent ist. Möglicherweise gibt es auch den einen oder anderen Lazarus Anwender, welcher den Anforderungen gar nicht gewachsen wären. ;-)
Ich finde es richtig, dass manchmal zugunsten von praktischen Lösungen von der reinen Lehre abgewichen wird.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Prozeduren/Methoden suchen

Beitrag von braunbär »

mse hat geschrieben:Im TForm create Vorgang wird auch das Formular geladen und je nach geladenen Komponenten verschiedenste On*-Events aufgerufen. Anwender schätzen es, wenn sie auf die Formularinstanz unde deren Komponenten zugreifen können und nicht den "Sender" Parameter typecasten und sich über die "Owner" Eigenschaften hoch hangeln müssen. Es gibt auch events ohne "Sender" Parameter oder wo "Sender" keine TComponent ist. Möglicherweise gibt es auch den einen oder anderen Lazarus Anwender, welcher den Anforderungen gar nicht gewachsen wären. ;-)
Ich finde es richtig, dass manchmal zugunsten von praktischen Lösungen von der reinen Lehre abgewichen wird.

Ich habe jetzt noch einmal darüber nachgedacht und sehe das Argument nicht. Im OnCreate der Form oder in einer Callback-Methode der Form (was du wohl mit On-Event meinst) kannst du doch immer über den Bezeichner self auf die Form und ihre Komponenten zugreifen. Dazu brauchst du keine globale Variable TMainform.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Prozeduren/Methoden suchen

Beitrag von mse »

Es gibt auch Ereigniseigenschaften in den erzeugten Unterkomponenten des Formulars welche in <Formular>.Create() gefeuert werden worin es entweder keinen "Sender" Parameter gibt oder der "Sender" Parameter nicht das Formular ist. Oder man ruft vielleicht eine andere Prozedur in einer anderen Unit auf wo "self" nicht zur Verfügung steht und man auf die globale Instanzvariable zugreifen muss. Die gesetzten Ereigniseigenschaften müssen auch nicht notwendigerweise im <Formular> angelegt sein.
Es geht darum, dass wenn eine Instanzvariable existiert man sich darauf verlassen kann, dass sie gültig ist.
Ich empfehle dir, die von Lazarus angelegte Instanzvariable zu löschen und auf Application.CreateForm() zu verzichten. Dann sind deine Programme rein. ;-)

Antworten