Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Identifier not found -- Wo steckt der Fehler (https://www.delphipraxis.net/199546-identifier-not-found-wo-steckt-der-fehler.html)

Schwalbe.Pilot 31. Jan 2019 08:16

Identifier not found -- Wo steckt der Fehler
 
Hallo zusammen,

Ich bin neu in diesem Forum, daher packt diesen Threat bitte an eine andere Stelle, wenn die aktuelle platzierung nicht passt.#
Auch bin ich neu in Pascal und daher wird dies bestimmt ein ,Aanfängerfehler sein, wo ihr euch denkt och man ist der doooooof :lol: (Bitte seht über diese Felerchen hinweg.

Zu meinem Compiler: Ich benutze Lazarus (hoffe ich bin hier im Delphi-Forum richtig) und es ist mein aller erstes Projekt damit.

So genug gequatsch hier kommt der Code:

Delphi-Quellcode:
unit DetektivwalterKohl;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons;

type

  { TForm1 }

  TForm1 = class(TForm)
    Hintergrund: TSpeedButton;
    RechterPfeil: TSpeedButton;
    LinkerPfeil: TSpeedButton;
    StartKnopf: TSpeedButton;
    StartBildschirm: TSpeedButton;
    procedure LinksPfeilKlick(Sender: TObject);
    procedure Start(Sender: TObject);
    procedure StartBildschirmClick(Sender: TObject);
    procedure StartClick(Sender: TObject);
    procedure WelcherHintergrund(HintergrundZaehler:Integer);
  private

  public

  end;

var
  Form1: TForm1;
  HintergrundZaehler : Integer;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.StartBildschirmClick(Sender: TObject);
begin
  HintergrundZaehler := 100 ;
  StartBildschirm.Glyph.loadfromfile('Startbildschirm.bmp'); // wechsel Bild zu TrippleD-production
  StartKnopf.Visible := True;
end;

procedure TForm1.Start(Sender: TObject);
begin

end;

procedure TForm1.LinksPfeilKlick(Sender: TObject);
begin
  HintergrundZaehler := HintergrundZaehler +1 ;
  WelcherHintergrund(HintergrundZaehler);
end;

procedure WelcherHintergrund(HintergrundZaehler:Integer);
begin
     if HintergrundZaehler = 99 then;
        Hintergrund.Glyph.loadfromfile('99.bmp');
end;

procedure TForm1.StartClick(Sender: TObject);
begin
  Hintergrund.Visible := True;
  RechterPfeil.Visible := True;
  LinkerPfeil.Visible := True;
  StartKnopf.Visible := False;
  StartBildschirm.Visible := False;

end;

end.
Jetzt zum Problem: In Zeile 63 also in der Fallunterscheidung zeigt er mir "Indentifier not found "Hintergrund"" an. So wie ich Pascal bis jetzt verstehe hab ich das doch aber oben denfiniert :?: .
Ich hoffe jemand kann mir helfen und ich kann das Programm fertigmachen.

Für eure Mühe und Zeit schon eimal vielen Dank.
Schönen Tag euch
Schwalbe.Pilot

PS.: Das Programm wir ein Spiel, genauer gesagt ein PointAndClickAdventuere, wenn ihr dafür weitere Tipps habt, ich nehme sie immer gerne :-D

haentschman 31. Jan 2019 08:57

AW: Identifier not found -- Wo steckt der Fehler
 
Willkommen...:dp:
Delphi-Quellcode:
procedure WelcherHintergrund(HintergrundZaehler:Integer);
begin
     if HintergrundZaehler = 99 then; // das ; ist zu viel :-)
        Hintergrund.Glyph.loadfromfile('99.bmp');
end;

Schwalbe.Pilot 31. Jan 2019 09:00

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Delphi-Quellcode:
procedure WelcherHintergrund(HintergrundZaehler:Integer);
begin
     if HintergrundZaehler = 99 then; // das ; ist zu viel :-)
        Hintergrund.Glyph.loadfromfile('99.bmp');
end;

Hallo,

An dem ; liegt es leider nicht, das hab ich da hin gesetzt um zu testen, ob es funktioniert.:( Denn mir wurde mal gesagt das die meisten fehler mit dem fehlenden ';' zusammenhängen.:?

Neutral General 31. Jan 2019 09:10

AW: Identifier not found -- Wo steckt der Fehler
 
Im Methodenkopf fehlt das "TForm1." vor dem Methodenname.
So ist es nur eine Prozedur, die nichts mit dem Formular und den Komponenten darauf zu tun hat. Dementsprechend kennt er den Hintergrund auch nicht.
Ach ja: Das Semikolon hinter dem "then" muss trotzdem/auch weg

Schwalbe.Pilot 31. Jan 2019 09:21

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von Neutral General (Beitrag 1424476)
Im Methodenkopf fehlt das "TForm1." vor dem Methodenname.
So ist es nur eine Prozedur, die nichts mit dem Formular und den Komponenten darauf zu tun hat. Dementsprechend kennt er den Hintergrund auch nicht.
Ach ja: Das Semikolon hinter dem "then" muss trotzdem/auch weg


Dankeschön :thumb:
Auf sowas sind wir zu dritt nach 2 Stunden suchen nicht gekommen :lol:
Ist das ein typische Anfängerfehler?
Auf jeden Fall danke für die Hilfe.

Ps: Ich lasse den Threat mal offen, falls noch solche Fehler kommen. :stupid:

Aviator 31. Jan 2019 09:24

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von Schwalbe.Pilot (Beitrag 1424479)
Zitat:

Zitat von Neutral General (Beitrag 1424476)
Im Methodenkopf fehlt das "TForm1." vor dem Methodenname.
So ist es nur eine Prozedur, die nichts mit dem Formular und den Komponenten darauf zu tun hat. Dementsprechend kennt er den Hintergrund auch nicht.
Ach ja: Das Semikolon hinter dem "then" muss trotzdem/auch weg


Dankeschön :thumb:
Auf sowas sind wir zu dritt nach 2 Stunden suchen nicht gekommen :lol:
Ist das ein typische Anfängerfehler?
Auf jeden Fall danke für die Hilfe.

Naja, ich denke den Fehler haben wir alle mal gemacht. Ob es jetzt ein typischer Anfängerfehler ist will ich jetzt mal nicht beantworten. ;)
Mich wundert nur, dass dein Compiler keinen Fehler gemeldet hatte, da du oben die procedure bereits bekannt gemacht, sie aber nicht implementiert hattest. (Weil das TForm1 fehlte)

Zitat:

Zitat von Schwalbe.Pilot (Beitrag 1424479)
Ps: Ich lasse den Threat mal offen, falls noch solche Fehler kommen. :stupid:

Ich sags mal so: Neuer Fehler --> neuer Thread :P

DP-Maintenance 31. Jan 2019 09:41

Dieses Thema wurde am "31. Jan 2019, 10:41 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "Object-Pascal / Delphi-Language" verschoben.

Andreas L. 31. Jan 2019 10:33

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von Schwalbe.Pilot (Beitrag 1424469)
procedure WelcherHintergrund(HintergrundZaehler:Integer);
begin
if HintergrundZaehler = 99 then; // das ; ist zu viel :-)
Hintergrund.Glyph.loadfromfile('99.bmp');
end;

Du solltest immer absolute Pfade verwenden. Ohne den Pfad wird die Datei aus dem aktuellen Arbeitsverzeichnis geladen. Das kann sich aber während der Laufzeit ändern.

Wenn das Bild im EXE-Ordner ist kannst du mit ParamStr(0) bzw. Application.Exename darauf zugreifen.

Delphi-Quellcode:
  // Pfad + Dateiname der EXE ermitteln (z. B. C:\Programme\meineapp.exe)
  FileName := Application.ExeName;
  // ODER
  FileName := ParamStr(0);

  // Den Pfad aus FileName extrahieren. Ergibt dann C:\Programme\
  Path := ExtractFilePath(FileName);
Delphi-Quellcode:
procedure WelcherHintergrund(HintergrundZaehler:Integer);
var
  FileName: String;
  Path: String;
begin
  FileName := Application.ExeName;
  Path := ExtractFilePath(FileName);

  if HintergrundZaehler = 99 then;
    Hintergrund.Glyph.loadfromfile(Path + '99.bmp');
end;
Wenn du den Pfad zu anderen Verzeichnissen ermitteln möchtest, kannst du die Funktionen SpecialDirectory, SHGetFolderPath oder GetKnownFolderPath verwenden. Diese geben dann Pfade wie z. B. Windows-Ordner, Video-Ordner, .... zurück.

Delphi-Quellcode:
function GetSpecialDirectory(ACSIDL: Integer; AHandle: Cardinal = 0): String;
const
  SHGFP_TYPE_CURRENT = 0;
var
  APIResult: HRESULT;
  Buffer: Array[0 .. MAX_PATH - 1] of WCHAR;
begin
  Result := '';

  APIResult := SHGetFolderPathW(AHandle, ACSIDL, 0, SHGFP_TYPE_CURRENT, Buffer);

  if APIResult = S_OK then
  begin
    Result := WideString(Buffer);
    Result := IncludeTrailingPathDelimiter(Result);
    Result := Trim(Result);
  end;
end;

freimatz 31. Jan 2019 10:42

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von Andreas L. (Beitrag 1424491)
Du solltest immer absolute Pfade verwenden. Ohne den Pfad wird die Datei aus dem aktuellen Arbeitsverzeichnis geladen. Das kann sich aber während der Laufzeit ändern.

Das finde ich nicht. In dem Stand in dem er sich gerade befindet (so meine Einschätzung) sollte er sich NOCH nicht mit so was beschäftigen. Das jetzt wirkt nur abschreckend.
Wichtiger finde ich jetzt dass er Spass dabei hat und der Lehrer zufrieden ist. :wink:

Wenn man dagegen eine ernsthafte Anwendung macht, dann muss man sich um das (u.v.a.m.) auch kümmern.

Andreas L. 31. Jan 2019 12:45

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von freimatz (Beitrag 1424492)
Im Stand in dem er sich gerade befindet (so meine Einschätzung) sollte er sich NOCH nicht mit so was beschäftigen. Das jetzt wirkt nur abschreckend.

Ich finde man sollte es lieber gleich richtig lernen als später Probleme und schlechte Angewohnheiten zu haben.

Und ParamStr(0) vor seinen Dateiname einzufügen ist ja nicht wirklich schwierig.

GetSpecialDirectory, etc. sind für einen Anfänger tatsächlich nichts. Da stimme ich dir zu.

Schwalbe.Pilot 5. Feb 2019 18:21

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von Andreas L. (Beitrag 1424491)
Zitat:

Zitat von Schwalbe.Pilot (Beitrag 1424469)
procedure WelcherHintergrund(HintergrundZaehler:Integer);
begin
if HintergrundZaehler = 99 then; // das ; ist zu viel :-)
Hintergrund.Glyph.loadfromfile('99.bmp');
end;

Du solltest immer absolute Pfade verwenden. Ohne den Pfad wird die Datei aus dem aktuellen Arbeitsverzeichnis geladen. Das kann sich aber während der Laufzeit ändern.

Wenn das Bild im EXE-Ordner ist kannst du mit ParamStr(0) bzw. Application.Exename darauf zugreifen.

Delphi-Quellcode:
  // Pfad + Dateiname der EXE ermitteln (z. B. C:\Programme\meineapp.exe)
  FileName := Application.ExeName;
  // ODER
  FileName := ParamStr(0);

  // Den Pfad aus FileName extrahieren. Ergibt dann C:\Programme\
  Path := ExtractFilePath(FileName);
Delphi-Quellcode:
procedure WelcherHintergrund(HintergrundZaehler:Integer);
var
  FileName: String;
  Path: String;
begin
  FileName := Application.ExeName;
  Path := ExtractFilePath(FileName);

  if HintergrundZaehler = 99 then;
    Hintergrund.Glyph.loadfromfile(Path + '99.bmp');
end;
Wenn du den Pfad zu anderen Verzeichnissen ermitteln möchtest, kannst du die Funktionen SpecialDirectory, SHGetFolderPath oder GetKnownFolderPath verwenden. Diese geben dann Pfade wie z. B. Windows-Ordner, Video-Ordner, .... zurück.

Delphi-Quellcode:
function GetSpecialDirectory(ACSIDL: Integer; AHandle: Cardinal = 0): String;
const
  SHGFP_TYPE_CURRENT = 0;
var
  APIResult: HRESULT;
  Buffer: Array[0 .. MAX_PATH - 1] of WCHAR;
begin
  Result := '';

  APIResult := SHGetFolderPathW(AHandle, ACSIDL, 0, SHGFP_TYPE_CURRENT, Buffer);

  if APIResult = S_OK then
  begin
    Result := WideString(Buffer);
    Result := IncludeTrailingPathDelimiter(Result);
    Result := Trim(Result);
  end;
end;

Upps, tut mir leid das ich erst jetzt Antworte. Hab keine E-Mail bekommen und auch sonst nicht mehr daran gedacht.

Das sieht ganz schön kompliziert aus:shock:

Für das aktuelle Projekt wrde ich dies wohl nicht mehr brauchen, denn hier sollte sich ja eigentlich nichts verschieben.
Zu dem Verfahren an sich habe ich jetzt aber noch eine Frage, wie läuft das ab, wenn ich den gesamten Ordner verschiebe? Passt das dann noch, oder muss man dann alles neu abändert? :?:

Danke aus jeden Fall für die Anregung
Schönen abend
Schwalbe Pilot

Andreas L. 6. Feb 2019 10:35

AW: Identifier not found -- Wo steckt der Fehler
 
Zitat:

Zitat von Schwalbe.Pilot (Beitrag 1424770)
Zu dem Verfahren an sich habe ich jetzt aber noch eine Frage, wie läuft das ab, wenn ich den gesamten Ordner verschiebe? Passt das dann noch, oder muss man dann alles neu abändert? :?:

Um welches Verzeichnis handelt es sich? Meinst du das Programm-Verzeichnis wo deine Exe liegt, ein System-Verzeichnis (z. B. Dokumente, Bilder, Downloads, ...) oder ein anderes Verzeichnis?

ParamStr(0) enthält den Pfad der EXE. Würde sich das Verzeichnis während der Laufzeit ändern würde ParamStr(0) natürlich nicht mehr stimmen bis das Programm neugestartet wurde. Also Programm beenden, aus dem neuen Ordner starten und dein ParamStr(0) stimmt wieder. Allerdings lässt sich der Ordnername bzw. die gesamte Verzeichnis-Struktur sowieso nicht ändern während das Programm läuft. Aber der Dateinamen der Anwendung lässt sich während der Laufzeit ändern (Windows Explorer, F2 drücken, EXE-Name ändern). Soweit ich informiert bin zeigt ParamStr(0) weiterhin auf den alten Dateinamen. Ein Neustart des Programms ist also nötig oder du verwendest den neuen Namen der EXE ohne auf ParamStr(0) zurückzugreifen. Den neuen Namen musst du natürlich erstmal ermitteln. Siehe unten.

Wenn sich spezielle Windows Verzeichnisse ändern, Z. B. Eigene Bilder zeigt GetSpecialDirectory(und die anderen Win-Funktionen) auf den neuen Pfad. Auch ohne neustart der EXE.

Wenn sich ein anderes Verzeichnis ändert (z. B. D:\Meine Sachen\Rechnung.pdf) bekommt das Programm das standardmäßig nicht mit. Es gibt aber Komponenten und Codes die prüfen ob sich was im Datei-System ändert und anschließend das laufende Programm über Änderungen benachrichtigen (siehe FileChangeNotifier). Im Demo-Ordner von Delphi sind Shell/Explorer-Komponenten enthalten die du installieren könntest. Diese bestehen aus einem Datei/Ordner-Liste/Baumstruktur/ComboBox und enthalten auch einen ChangeNotifier. Allerdings sind die Komponenten nicht so der Hit...

Schwalbe.Pilot 6. Feb 2019 10:47

AW: Identifier not found -- Wo steckt der Fehler
 
Naja wenn ich einfach den Ordner den ich für das Programm habe, nehme und auf einen anderen PC tue. Dann ändert sich das Verzeichnis.

Mit deiner Erklärung hab ich jetzt verstanden das es kein Problem ist.:thumb: Das ist super.

Danke die Hilfe.
Und einen schönen Tag noch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz