Prozeduren/Methoden suchen

Für Fragen rund um die Ide und zum Debugger

Prozeduren/Methoden suchen

Beitragvon braunbär » 7. Okt 2018, 22:14 Prozeduren/Methoden suchen

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.
braunbär
 
Beiträge: 258
Registriert: 8. Jun 2017, 17:21

Beitragvon wp_xyz » 7. Okt 2018, 22:51 Re: Prozeduren/Methoden suchen

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).
wp_xyz
 
Beiträge: 2699
Registriert: 8. Apr 2011, 08:01

Beitragvon mse » 8. Okt 2018, 07:05 Re: Prozeduren/Methoden suchen

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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon braunbär » 8. Okt 2018, 10:26 Re: Prozeduren/Methoden suchen

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.
braunbär
 
Beiträge: 258
Registriert: 8. Jun 2017, 17:21

Beitragvon mse » 8. Okt 2018, 12:42 Re: Prozeduren/Methoden suchen

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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon braunbär » 12. Okt 2018, 12:13 Re: Prozeduren/Methoden suchen

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.
braunbär
 
Beiträge: 258
Registriert: 8. Jun 2017, 17:21

Beitragvon mse » 12. Okt 2018, 12:39 Re: Prozeduren/Methoden suchen

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. ;-)
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

• Themenende •

Zurück zu Benutzung der IDE



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried