Funktion wird nicht gefunden, warum?

Für Fragen rund um die Ide und zum Debugger
Antworten
thosch
Beiträge: 193
Registriert: Mo 10. Jul 2017, 20:32

Funktion wird nicht gefunden, warum?

Beitrag von thosch »

Hallo,

ich habe diesen Quellcode:

Code: Alles auswählen

 
var
  wc: TWndClassEx;
begin
  wc.cbSize          := SizeOf(TWndClassEx);
  wc.Style           := CS_HREDRAW or CS_VREDRAW;
  wc.lpfnWndProc     := @MyWindowProc;
  wc.cbClsExtra      := 0;
  wc.cbWndExtra      := 0;
  wc.lpszMenuName    := nil;
  wc.lpszClassName   := 'Hauptfenster';
  wc.hIconSm         := 0;
 
  RegisterClassEx(wc);
 
  CreateWindowEx(
    0,
    'Hauptfenster',
    'Testanwendung',
    WS_CAPTION,
    100,50,
    800,600,
    0,
    0,
    0,
    nil
  );
 


Nun sagt mir der Compiler, er könne die Funktion CreateWindowEx nicht finden. Ist die nicht genauso in der Windows Unit definiert wie die Funktion RegisterclassEx? Die moniert der Compiler nicht. Was ist hier los?

Weil mich dieses Verhalten irretiert, habe ich diese Frage in "Benutzung der IDE" gepostet, da Freepascal sehr viele Include Dateien verwendet. Kann es sein, dass der Compiler da durcheinander kommt?

Ich benutze hierfür Lazarus 1.6.4!

.

Socke
Lazarusforum e. V.
Beiträge: 2737
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Funktion wird nicht gefunden, warum?

Beitrag von Socke »

thosch hat geschrieben:ich habe diesen Quellcode:

Ohne deinen Uses-Abschnitt lässt sich das wohl nicht beantworten ... Die Funktion CreateWindowEx ist zumindest bei FPC 3.0.4 in der Windows-Unit enthalten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

thosch
Beiträge: 193
Registriert: Mo 10. Jul 2017, 20:32

Re: Funktion wird nicht gefunden, warum?

Beitrag von thosch »

Socke hat geschrieben:
thosch hat geschrieben:ich habe diesen Quellcode:

Ohne deinen Uses-Abschnitt lässt sich das wohl nicht beantworten ... Die Funktion CreateWindowEx ist zumindest bei FPC 3.0.4 in der Windows-Unit enthalten.


Und bei FPC 3.0.2? Kann es Probleme geben wenn die Funktion in eine Include Datei ausgelagert wurde. Ich habe nur die Units Classes, Sysutils und Windows in meiner Uses Klausel stehen. In dieser Reihenfolge. Kann mir allerdings nicht vorstellen, dass die Reihenfolge da so entscheidend ist.

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: Funktion wird nicht gefunden, warum?

Beitrag von MacWomble »

Was passiert denn, wenn du CreateWindowsEx markierst, die rechte Maustaste betätigst und auf 'finde Deklaration' gehst?

Du kannst auch direkt in der unit windows.pas nachsehen, ob die Funktion dort enthalten ist.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4146
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Funktion wird nicht gefunden, warum?

Beitrag von af0815 »

thosch hat geschrieben:Und bei FPC 3.0.2? Kann es Probleme geben wenn die Funktion in eine Include Datei ausgelagert wurde.

Ob es bei 3.0.2 drinnen ist, kannst DU einfach nachsehen. Nein, das auslagern in include macht keine Probleme, ausser ams such es nicht mit Lazarus und muss dann rätseln wo es dazugehört. Es ist Teil des Konzeptes, damit Plattformspezifische Teile einfacher zugeordnet werden können, halt ohne große IFDEF Origien. Dazu wird der Plattformspezifische aufruf in der include Datei untergebracht während das Interface allgemein ist.

Ich verwendet öfters den 'Agent Ransack' wenn mir was fehlt und ich will wissen wo das ev. in den Sourcen verwendet oder deklariert wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

thosch
Beiträge: 193
Registriert: Mo 10. Jul 2017, 20:32

Re: Funktion wird nicht gefunden, warum?

Beitrag von thosch »

Danke zunächst für Eure Hilfe. Ich habe in den Projekteinstellungen nachgeschaut und da muss ich feststellen, dass ich keine Pfade mehr unter andere Units hinzufügen kann. Weder durch Eingabe in die Eingabzeile durch Semikolons getrennt, noch durch Aufruf des Eingabedialoges durch Klicken des Buttons rechts neben der Eingabezeile. Was ist da los?

Wie war das gleich noch mal mit der fpc Kommandozeile? Ich kann doch noch eine extrafpc.cfg Datei schreiben, die meine Pfade enthält.

Oder ich kann doch auch unter Compilerkommandos Eintragungen vornehmen. WO trage ich da meine extrafpc.cfg ein? Reicht es dann, nur den DAteinamen dieser Datei eizugeben oder muss ich da weitere Optionen setze?

Ich habe ja da schon mal den Dialog "Einstellungen für Projekt", dort Compiler, wo in der Eingabezeile das Makro $(CompilerPath) eingetragen ist. Sicher hat aber nun Lazarus schon eine Kommandozeile implizit, sonst würde ja das Compilieren überhaupt nicht klappen. Wie also trage ich nun die Zusatzoption ein, dass der meine Datei extrafpc.cfg mit meinen Pfadangeben mit verarbeiten soll, ohne die implizite Kommandozeile kaputt zu machen? Ich will ja nun während des Kompiliervorganges diese Datei auswerten.

Als Workaround kann ich natürlich meine Pfade in die fpc.cfg im Bin Verzeichnis meines Compilers schreiben.

Die saubere Lösung aber wäre die projektspezifischen Pfade in die extrafpc.cfg zu schreiben und Lazarus diese Datei zur Auswertung zu übergeben. Aber wie mache ich das in Lazarus. Ich glaube nicht, das ich diese Datei einfach nur hinter das Makro $(CompilerPath) schreiben muss. Da wird wohl noch mehr dazu gehören, aber was?
Zuletzt geändert von thosch am Di 13. Nov 2018, 16:20, insgesamt 1-mal geändert.

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

Re: Funktion wird nicht gefunden, warum?

Beitrag von wp_xyz »

Bevor du an den Pfaden herumfummelst, würde ich vorschlagen, einfach Lazarus neu zu installieren - du bist auf Windows, und da ist das eine Sache von ein paar Minuten.

thosch
Beiträge: 193
Registriert: Mo 10. Jul 2017, 20:32

Re: Funktion wird nicht gefunden, warum?

Beitrag von thosch »

Dann werde ich die Neuinstallation auch machen. Danke Euch allen für Eure Hilfestellung! Manchmal ist "der Wurm drin"!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4146
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Funktion wird nicht gefunden, warum?

Beitrag von af0815 »

thosch hat geschrieben:Danke zunächst für Eure Hilfe. Ich habe in den Projekteinstellungen nachgeschaut und da muss ich feststellen, dass ich keine Pfade mehr unter andere Units hinzufügen kann. Weder durch Eingabe in die Eingabzeile durch Semikolons getrennt, noch durch Aufruf des Eingabedialoges durch Klicken des Buttons rechts neben der Eingabezeile. Was ist da los?

Hast du den Effekt auch bei einem neu erstellten Programm oder nur bei einem bestehenden ?! Weil laut Beschreibung du hier in den Projektspezifischen Einstellungen bist, nicht in den direkt Lazarusspezifischen. Nicht, das du nur ein Problem mit dem Projekt hast.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

thosch
Beiträge: 193
Registriert: Mo 10. Jul 2017, 20:32

Re: Funktion wird nicht gefunden, warum?

Beitrag von thosch »

af0815 hat geschrieben:
thosch hat geschrieben:Danke zunächst für Eure Hilfe. Ich habe in den Projekteinstellungen nachgeschaut und da muss ich feststellen, dass ich keine Pfade mehr unter andere Units hinzufügen kann. Weder durch Eingabe in die Eingabzeile durch Semikolons getrennt, noch durch Aufruf des Eingabedialoges durch Klicken des Buttons rechts neben der Eingabezeile. Was ist da los?

Hast du den Effekt auch bei einem neu erstellten Programm oder nur bei einem bestehenden ?! Weil laut Beschreibung du hier in den Projektspezifischen Einstellungen bist, nicht in den direkt Lazarusspezifischen. Nicht, das du nur ein Problem mit dem Projekt hast.


Bei einem bestehenden. Nachdem ich das Hauptprogramm geändert habe. Um damit eine Unit des bestehenden Projektes zu testen.

Neues Projekt erstellt und die zu testende Unit meines bestehenden Projektes dort in die Uses Klausel aufgenommen.

.

Antworten