Procedure/Bezeichner mit der IDE suchen

Für Fragen rund um die Ide und zum Debugger
Antworten
Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Procedure/Bezeichner mit der IDE suchen

Beitrag von Mathias »

Wen ich in folgender Zeile "SetAlternativeCompile" markiere und Alt+Hoch drücke,

Code: Alles auswählen

  AProject.LazCompilerOptions.SetAlternativeCompile('vorher', True);


Springt die IDE auf folgende Zeilen in der Unit "CompOptsIntf".

Code: Alles auswählen

    // execute
    property CompilerPath: String read GetCompilerPath write SetCompilerPath;
    procedure SetAlternativeCompile(const Command: string; ScanFPCMsgs: boolean); virtual; abstract; // disable normal compile and call this instead
  end;
Das diese Procedure als abstract deklariert ist, gibt es auch keine passende Procedure im implementations-Teil.

Aber leer kann die Procedure aber nicht sein, ansonsten würde ein Aufruf von ihr ins Leere gehen. Somit muss die Procedure irgendwo vorhanden sein, nur die Frage wo ?

Ich habe mit "grep" den ganzen Lazarus-Ordner durchsucht, und wurde fündig xxx/lazarus/ide/compileroptions.pp und xxx/lazarus/ide/project.pp.
Wieso aber findet die IDE diese beiden Units nicht ?
Der Compiler hat sie anscheinend gefunden, ansonsten würde der Aufruf von SetAlternativeCompile von wie oben beschrieben ins Leer gehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1491
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Procedure/Bezeichner mit der IDE suchen

Beitrag von Warf »

Ganz einfach, es wird eine abgeleitete klasse verwendet die woanders definiert ist, aber nur per die Oberklasse angesprochen wird. Z.B. Eine listbox hat eine TStrings properly (items) aber das ist eine abstrakte Klasse. Die tatsächliche Instanz ist eine TStringList. Nur von dem schauen in TStrings findest du aber nicht dir implementation.

Schau dir an wie das Objekt das du verwendest erzeugt wird, da ist die Klasse die du dir anschauen musst (kann z.b. Dynamisch entschieden werden was für das aktuelle System besser passt, ist also nicht unbedingt sehr einfach)

Oder mach ein grep nach „class(AbstrakteKlassenName)“ über den gesamten source Ordner:

Code: Alles auswählen

grep -ir "= class(XXX)" /xxx/src 

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Procedure/Bezeichner mit der IDE suchen

Beitrag von Mathias »

grep spuckt mir folgendes aus:

Code: Alles auswählen

~/fpcupdeluxe/lazarus $ grep SetAlternativeCompile * -ir
components/instantfpc/instantfpcregisterlaz.pas:  AProject.LazCompilerOptions.SetAlternativeCompile(
Übereinstimmungen in Binärdatei components/ideintf/units/x86_64-linux/nogui/compoptsintf.ppu
Übereinstimmungen in Binärdatei components/ideintf/units/x86_64-linux/nogui/compoptsintf.o
Übereinstimmungen in Binärdatei components/ideintf/units/x86_64-linux/gtk2/compoptsintf.ppu
Übereinstimmungen in Binärdatei components/ideintf/units/x86_64-linux/gtk2/compoptsintf.o
components/ideintf/compoptsintf.pas:    procedure SetAlternativeCompile(const Command: string; ScanFPCMsgs: boolean); virtual; abstract; // disable normal compile and call this instead
ide/compileroptions.pp:    procedure SetAlternativeCompile(const Command: string; ScanFPCMsgs: boolean); override;
ide/compileroptions.pp:procedure TBaseCompilerOptions.SetAlternativeCompile(const Command: string;
ide/project.pp:    procedure SetAlternativeCompile(const Command: string; ScanFPCMsgs: boolean); override;
ide/project.pp:procedure TProjectCompilerOptions.SetAlternativeCompile(const Command: string;
ide/project.pp:  inherited SetAlternativeCompile(Command, ScanFPCMsgs);
Übereinstimmungen in Binärdatei lazarus
Übereinstimmungen in Binärdatei lazarus.old
Übereinstimmungen in Binärdatei lazbuild
Übereinstimmungen in Binärdatei tools/lazdatadesktop/lazdatadesktop
Übereinstimmungen in Binärdatei units/x86_64-linux/nogui/project.o
Übereinstimmungen in Binärdatei units/x86_64-linux/nogui/packagedefs.o
Übereinstimmungen in Binärdatei units/x86_64-linux/nogui/compileroptions.o
Übereinstimmungen in Binärdatei units/x86_64-linux/nogui/compileroptions.ppu
Übereinstimmungen in Binärdatei units/x86_64-linux/nogui/project.ppu
Übereinstimmungen in Binärdatei units/x86_64-linux/gtk2/project.o
Übereinstimmungen in Binärdatei units/x86_64-linux/gtk2/packagedefs.o
Übereinstimmungen in Binärdatei units/x86_64-linux/gtk2/compileroptions.o
Übereinstimmungen in Binärdatei units/x86_64-linux/gtk2/compileroptions.ppu
Übereinstimmungen in Binärdatei units/x86_64-linux/gtk2/project.ppu


Einzig im Ordner ide, hat es Vererbungen von SetAlternativeCompile.
Aber ist ide nicht die Lazarus-IDE ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

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: Procedure/Bezeichner mit der IDE suchen

Beitrag von mse »

MSEide 'Search'-'Find in Files' liefert:
findinfile.png

Doppelklick in Zeile 4 springt zu:
source1.png

Ctrl+Shift+Up springt zum Header, der Klassenkopf sieht so aus:
source2.png

Ctrl+LeftClick auf TLazCompilerOptions springt auf
source3.png

wo die abstrakte Definition von SetAlternativeCompile() steht. AProject.LazCompilerOptions ist wahrscheinlich vom Typ TLazCompilerOptions daher zeigt Lazarus die Definition TLazCompilerOptions.SetAlternativeCompile(). Dass zur Laufzeit AProject.LazCompilerOptions eine Instanz von TBaseCompilerOptions oder TProjectCompilerOptions (Zeile 6 von 'Find in file result') ist, kann Lazarus nicht wissen.

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Procedure/Bezeichner mit der IDE suchen

Beitrag von Mathias »

Die MSEide kommt etwa auf das gleiche Ergebnis wie grep.

Verstehe ich es richtig. In der Unit CompOptsIntf wir SetAlternativeCompile als virtual/abstract deklariert, das ich es in meiner Package überhaupt verwenden kann.
Da ich eine Package entwickle braucht es zur Entwicklungszeit noch keine Funktion für SetAlternativeCompile.
Aber sobald ich die Package in die Lazarus-IDE einbinde, dann muss die Funktion SetAlternativeCompile zu Verfügung stehen. Und dort ist sie auch vorhanden, so wie grep es beweist.

Mein Problem, das ich überhaupt Frage, ist hier beschrieben: viewtopic.php?f=18&t=11760
Ich will eine Funktion einbauen, mit dem ich die "Nacher" Option beschreiben kann.
So wie es scheint, müsste man dafür zuerst die ganze Lazarus-IDE modifizieren.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten