code kompiliert mit neuer lazarus-version nicht mehr

Rund um die LCL und andere Komponenten
Antworten
Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von Leberecht »

hallo,

hab mir eben die neue lazarus-version 0.9.30.4 (win32) installiert, vorher hatte ich 0.9.30 (fpc 2.4.2). jetzt kompiliert er mein projekt nicht mehr durch, er bleibt
an der fehlermeldung

Error: Call by var for arg no. 1 has to match exactly: Got "TFrmMeldungsfenster" expected "TForm"

hängen. ich übergebe dort (siehe code) ein formularobjekt(FrmMeldungsfenster) an eine funktion. vorher hat das problemlos funktioniert. da ich der funktion viele verschiedene formulare
übergebe, kann ich schlecht den exakten typen in der funktionsdeklaration vorher angeben.

Code: Alles auswählen

procedure setzeLookAndFeel(var oForm: TForm; iNr:longint=-1; iFormindex:longint=-1);
setzeLookAndFeel(FrmMeldungsfenster);
was kann ich da tun? kann man dieses verhalten irgentwo abschalten?
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

martin_frb
Beiträge: 588
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von martin_frb »

http://wiki.lazarus.freepascal.org/User ... parameters" onclick="window.open(this.href);return false;

Brauchst du den das "var"?

Wenn du nur existierend Forms uebergibst, und nur properties von denen aenderst, dann brauchst Du das nicht

Forms/Objecte, sind pointer. Nur wenn du

oForm := TFoo.Create
oForm := nil
oForm := OtherForm

machst, dann brauchst du var

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von Leberecht »

habs jetzt raus. musste den pointer auf TForm-casten, dann gings.
also

setzeLookAndFeel(TForm(FrmMeldungsfenster));

er scheint jetzt strenger auf pointertypen zu achten als vorher bzw. keine automatischen casts mehr vorzunehmen. na, egal. ich musste ja nur ca. 500 stellen im code korigieren. :evil:

@martin_frm:

ja, ich weiss schon das forms/objekte pointer sind. ich wollte das deshalb in der funktionsdeklaration mit "var" zum ausruck bringen. also würde es reichen, wenn ich stattdessen:

procedure setzeLookAndFeel(oForm: TForm; iNr:longint=-1; iFormindex:longint=-1);

schreiben würde? würde er dann auch nur den pointer vom übergebenen formular in parameter 1 übergeben?
ich möchte ja in jedem fall nur den zeiger auf das formular übergeben und nicht das ganze formularobjekt mit all seinen daten.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

martin_frb
Beiträge: 588
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von martin_frb »

Leberecht hat geschrieben:habs jetzt raus. musste den pointer auf TForm-casten, dann gings.
ja, ich weiss schon das forms/objekte pointer sind. ich wollte das deshalb in der funktionsdeklaration mit "var" zum ausruck bringen. also würde es reichen, wenn ich stattdessen:

procedure setzeLookAndFeel(oForm: TForm; iNr:longint=-1; iFormindex:longint=-1);

schreiben würde? würde er dann auch nur den pointer vom übergebenen formular in parameter 1 übergeben?
ich möchte ja in jedem fall nur den zeiger auf das formular übergeben und nicht das ganze formularobjekt mit all seinen daten.
Wenn setzeLookAndFeel nur werte des FormObject aendert zB "oForm.Color := clRed" dann brauchst du kein var

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von carli »

Leberecht hat geschrieben:habs jetzt raus. musste den pointer auf TForm-casten, dann gings.
also

setzeLookAndFeel(TForm(FrmMeldungsfenster));

er scheint jetzt strenger auf pointertypen zu achten als vorher bzw. keine automatischen casts mehr vorzunehmen. na, egal. ich musste ja nur ca. 500 stellen im code korigieren. :evil:
Die Pointertypen werden nur so streng gehandelt, wenn es sich um var-Parameter handelt. In dem Fall ist var aber Schwachsinn, weil Klassen eh schon Referenzen auf die Instanz sind.

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von Leberecht »

ok, verstanden. verhält es sich auch mit records so? d.h. wenn ich records übergebe, wird dann auch atomatisch die referenz übergeben?
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von m.fuchs »

Leberecht hat geschrieben:ok, verstanden. verhält es sich auch mit records so? d.h. wenn ich records übergebe, wird dann auch atomatisch die referenz übergeben?
Nein.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: code kompiliert mit neuer lazarus-version nicht mehr

Beitrag von carli »

Zur Zusammenfassung:
- Class und Pointertypen werden als Referenz übergeben
- object und record werden als Daten übergeben
- Argumente einer Prozedur werden als Daten übergeben
- bei const, out oder var werden Argumente einer Prozedur als Referenz übergeben (bei var x: TKlasse doppelt referenziert)
- var- und out-Parameter müssen EXAKT dem Typ entsprechen, denn sonst könnte die aufgerufene Funktion eine inkompatible Instanz in der Variablen ablegen

Antworten