2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
Hallo,
Mir ist noch ein Bug aufgefallen, ich meine der ist schon länger in der IDE drin.
Folgender Ablauf:
Man hat irgend ein Projekt in der hat man in einer lokalen Funktion eine Variable "n1" im VAR Block.
Nun übersetzt man, OK, Warnings weil die Variable in dem Demo noch benutzt wird.
Dann möchte ich ein Popup Menü drauf haben und in dem ein "-" als Trenner.
Lazarus benamt diesen Trenner automatisch als "N1".
Wenn man jetzt übersetzt knallt es - der FPC hat ein Problem mit einer gleichnamigen lokalen Variable einer Funktion. Eigentlich sollte der FPC nur eine Warnung ausgeben, denn die lokale Variable hat eigentlich Vorrang.
Doch nun will ich das Popup Menü "N1" umbenennen in "mn_N1", dann benennt Lazarus auch die Variable in der lokalen Funktion um, damit kann man sich so ziemlich viel kaputt machen, da ein "n1" durchaus in vielen Funktionen gebraucht wird. Auch nach dem Umbenennen des Menüs gibt es daher immer noch den Übersetzungsfehler.
Anbei ein kleiner Film wie das aussieht: Bugreport schreiben?
VG Markus
Mir ist noch ein Bug aufgefallen, ich meine der ist schon länger in der IDE drin.
Folgender Ablauf:
Man hat irgend ein Projekt in der hat man in einer lokalen Funktion eine Variable "n1" im VAR Block.
Nun übersetzt man, OK, Warnings weil die Variable in dem Demo noch benutzt wird.
Dann möchte ich ein Popup Menü drauf haben und in dem ein "-" als Trenner.
Lazarus benamt diesen Trenner automatisch als "N1".
Wenn man jetzt übersetzt knallt es - der FPC hat ein Problem mit einer gleichnamigen lokalen Variable einer Funktion. Eigentlich sollte der FPC nur eine Warnung ausgeben, denn die lokale Variable hat eigentlich Vorrang.
Doch nun will ich das Popup Menü "N1" umbenennen in "mn_N1", dann benennt Lazarus auch die Variable in der lokalen Funktion um, damit kann man sich so ziemlich viel kaputt machen, da ein "n1" durchaus in vielen Funktionen gebraucht wird. Auch nach dem Umbenennen des Menüs gibt es daher immer noch den Übersetzungsfehler.
Anbei ein kleiner Film wie das aussieht: Bugreport schreiben?
VG Markus
Zuletzt geändert von MmVisual am Mi 17. Nov 2021, 07:55, insgesamt 2-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1646
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: 2.2.0-RC2: Automatische Umbenennung im Code
Boa das ist bös. Ja bitte unbedingt Bugreport.
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: 2.2.0-RC2: Automatische Umbenennung im Code
Bugreport: https://gitlab.com/freepascal.org/lazar ... sues/39471
Vorgehensweise um so ein Fehler manuell zu beheben:
Das Menü TMenuItem.Name wieder zurück umbenennen in "n1", damit werden alle lokale Variablen ebenfalls wieder zurück umbenannt.
Lazarus schließen
Die *.lfm Datei öffnen, das MenüItem darin suchen und den Name umbenennen
Die *.pas Datei öffnen, das MenüItem darin in der Typdeklaration suchen und ebenfalls den Name umbenennen
Nun kann wieder ganz normal mit Lazarus weiter gearbeitet werden.
Am Besten erst einmal übersetzen um zu sehen dass es wirklich geklappt hat.
Vorgehensweise um so ein Fehler manuell zu beheben:
Das Menü TMenuItem.Name wieder zurück umbenennen in "n1", damit werden alle lokale Variablen ebenfalls wieder zurück umbenannt.
Lazarus schließen
Die *.lfm Datei öffnen, das MenüItem darin suchen und den Name umbenennen
Die *.pas Datei öffnen, das MenüItem darin in der Typdeklaration suchen und ebenfalls den Name umbenennen
Nun kann wieder ganz normal mit Lazarus weiter gearbeitet werden.
Am Besten erst einmal übersetzen um zu sehen dass es wirklich geklappt hat.
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
Ja... in diese Falle bin ich auch schon gerannt und habe es, wie von MmVisual beschrieben, gelöst.
Gruß, Michael
Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
Habe dasselbe nun mit einem anderen Control durchgespielt: Setze ein TEdit aufs Formular --> es entsteht eine formularweit gültige Variable Form1. In OnCreate-Handler des Formular deklariere ich eine lokale Variable Edit1. Wenn ich das TEdit im Objektinspektor umbenenne wird auch - wie geschildert - die lokale Variable umbenannt. Hmm... Aber eigentlich ist das ein konstruiertes Beispiel: Niemand wird bei FPC eine lokale Variable genauso nennen wie eine klassenweite Komponente, denn der Compiler wird das vor allem im Mode ObjFPC nicht akzeptieren - zum Glück ist FPD da viel pingeliger als Delphi.
Ich denke das Haupt-Problem liegt darin, dass die IDE einen MenuItem zu N1, N2, N3 etc umbenennt, wenn die Caption zu '-' gesetzt wird. Warum ist das nötig? Wieder so ein Delphi-Erbe... Denn der vorher vergebene Name, MenuItem1, MenuItem2 etc ist doch völlig ok, und die Wahrscheinlichkeit für eine Kollision mit einer lokalen Variablen mit demselben Namen ist minimal.
Ich denke das Haupt-Problem liegt darin, dass die IDE einen MenuItem zu N1, N2, N3 etc umbenennt, wenn die Caption zu '-' gesetzt wird. Warum ist das nötig? Wieder so ein Delphi-Erbe... Denn der vorher vergebene Name, MenuItem1, MenuItem2 etc ist doch völlig ok, und die Wahrscheinlichkeit für eine Kollision mit einer lokalen Variablen mit demselben Namen ist minimal.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1646
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
Also laut der Sprachdefinition darf man gleichlautende lokale Variablennamen verwenden.
Wenn es einfach nur globale Variablen sind, meckert der Compiler auch nicht.
Nur wenn es sich um Felder der TForm Klasse handelt.
Das ist irgendwie inkonsistent.
Wohingegen folgender Code ohne Mecker übersetzt wird.
Innerhalb von TForm1.FormCreate gilt die lokale Variable ansonsten die globale.
Solche Dinge sind sicher unschöner Programmierstil.
Wenn es einfach nur globale Variablen sind, meckert der Compiler auch nicht.
Nur wenn es sich um Felder der TForm Klasse handelt.
Das ist irgendwie inkonsistent.
Code: Alles auswählen
type
TForm1 = class ( TForm )
public
bla : string;
procedure FormCreate(Sender : TObject);
end;
procedure TForm1.FormCreate(Sender : TObject);
var bla : integer; // <- Fehlermeldung duplicate Identifier
begin
end;
Code: Alles auswählen
type
TForm1 = class ( TForm )
public
procedure FormCreate(Sender : TObject);
end;
var bla : string;
procedure TForm1.FormCreate(Sender : TObject);
var bla : integer;
begin
end;
Solche Dinge sind sicher unschöner Programmierstil.
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
So sollte niemand programmieren, jedoch würde es vollkommen ausreichend sein wenn der Compiler eine Warning ausgibt, dass hier ein möglicher Programmierfehler entstanden ist.Solche Dinge sind sicher unschöner Programmierstil.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
Das kann man übersetzen:
Die Variable innerhalb einer Funktion die innerhalb einer Funktion angelegt ist, da meckert der FPC nicht.
Das Umbenennen ist in diesem Fall dennoch ein Problem.
Code: Alles auswählen
Type
TForm1 = Class(TForm)
Procedure FormCreate(Sender: TObject);
private
public
bla: String
End;
Procedure TForm1.FormCreate(Sender: TObject);
Procedure InternFct();
var bla : integer;
Begin
End;
Begin
end;
Das Umbenennen ist in diesem Fall dennoch ein Problem.
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]
Wie denn? Mit "Search & Replace" im Editor? Das darf man nicht tun, das geht auf jeden Fall schief. Wenn ich das globale "bla" rechts anklicke und mit "Refactoring" > "Rename identifier" umbenenne, bleibt da lokale "bla" dagegen unverändert.MmVisual hat geschrieben: Mi 17. Nov 2021, 15:10 Das Umbenennen ist in diesem Fall dennoch ein Problem.