Anfangshürden

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfangshürden

Beitrag von theo »

Hitman hat geschrieben:Das wäre in dem Kontext aber Quark. "As" führt nochmal einen Typ-Check durch, das wäre mehr als sinnlos. Hier sollte man also durchaus beim "direkten" Cast bleiben, wenn man ohnehin vorher schon auf den Typ geprüft hat.
Ich wollte nur auf die Möglichkeit hingewiesen haben. "Quark" und "mehr als sinnlos" ist doch ziemlich übertrieben.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Anfangshürden

Beitrag von Hitman »

theo hat geschrieben:Ich wollte nur auf die Möglichkeit hingewiesen haben. "Quark" und "mehr als sinnlos" ist doch ziemlich übertrieben.
"In dem Kontext" nicht ;-) War aber nicht so drastisch gemeint wie es vielleicht klang.

Für "as" hätte man ein günstigeres Beispiel wählen müssen, um sinnvoll zu sein:

Code: Alles auswählen

var
  listBox: TListBox;
begin
  listBox := Sender as TListBox;
  if listBox <> nil then
  begin
    {... do stuff with listbox here}
  end;
end;

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfangshürden

Beitrag von theo »

Hitman hat geschrieben: Für "as" hätte man ein günstigeres Beispiel wählen müssen, um sinnvoll zu sein:
Ich kann auch Klugscheissern ;-)

Das ist nun WIRKLICH Falsch! as gehört in diesem Falle in ein try..except da es ein EInvalidCast schmeisst, im Unterschied zum direkten cast, wo die Misere erst später bemerkbar wird.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Anfangshürden

Beitrag von Hitman »

Stimmt, da hab ich mich wohl von C# hinreißen lassen. Dennoch führt "as" nochmal "is" aus - würde ich also nach wie vor vermeiden, wenn man ohnehin vorher "is" schon ausführt. (wenn man sich den generierten code mal anschaut, wird das erheblich mehr dadurch)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Anfangshürden

Beitrag von pluto »

Code: Alles auswählen

if listBox <> nil then
  begin
    {... do stuff with listbox here}
  end;
Ich glaube es ist sinnvoller das mit Assigned zu machen. Z.B. so: if Assigned(ListBox) then ....
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfangshürden

Beitrag von theo »

pluto hat geschrieben: Ich glaube es ist sinnvoller das mit Assigned zu machen. Z.B. so: if Assigned(ListBox) then ....
Hast du meinen Kommentar gelesen?
Käse bleibt Käse ob mit Assigned oder <>nil .
Wieso soll übrigens assigned hier sinnvoller sein? (Vorausgesetzt das Beispiel wäre überhaupt sinnvoll)

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Anfangshürden

Beitrag von AlterMann »

Merkwürdiges Phänomen

Code: Alles auswählen

procedure TForm1.Button3Click(Sender: TObject);
 
 var i : word;
     AktiveLB : TListBox;
 
 
begin
 for i:=0 to PageControl2.ActivePage.ControlCount-1 do
if PageControl2.ActivePage.Controls[i] is TListBox then
begin
if Edit1.Text <> '' then
   begin
    AktiveLB := TlistBox(PageControl2.ActivePage.Controls[i]);
    AktiveLB.Items.Add(Edit1.Text);
    //ShowMessage(AktiveLB.Items[1]);
    break;
   end;
   end;
end;
Wenn ich dieses Stück Code so laufen lasse, funktioniert es wie gewünscht.
Der Text aus Edit1 wird in die aktive Listbox eingefügt.
(Drück ich 10x auf Button3 auch 10 mal)

Sobald ich die Zeile mit ShowMessage mitcompiliere (Kommentar weg) fügt das Programm den Text in die Listbox ein, zeigt mir die Message (Mit dem Inhalt des zweiten Elementes wie's sein soll, und sobald ich in der MessageBox "Ok" drücke, ist das Element wieder aus der Listbox verschwunden.

Kann mir das jemand erklären?
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfangshürden

Beitrag von theo »

AlterMann hat geschrieben:Kann mir das jemand erklären?
Kann ich nicht reproduzieren Lazarus 0.9.29 r22524M FPC 2.2.4 i386-linux-gtk 2 (beta)

Welches Betriebssystem? Welche Laz Version? (Hilfe -> Über Lazarus -> Rechts-Click auf das Bild)

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Anfangshürden

Beitrag von AlterMann »

Lazarus 0.9.28.2 r22279 FPC 2.2.4 i386-win32-win32/win64

XP-Prof
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfangshürden

Beitrag von theo »

AlterMann hat geschrieben:Lazarus 0.9.28.2 r22279 FPC 2.2.4 i386-win32-win32/win64
Mal abwarten, vielleicht kann das ein Windöser bestätigen.

Mir ist aber Showmessage für sowas zu mühsam.
Mach mal Projekt -> Compilereinstellungen -> Linken bei Win32 GUI Anwendung das Häkchen weg. Dann kriegst du zusätzlich eine Konsole auf die du writeln kanst.
Writeln ist nur schon besser, weil du nicht alles Umwandlen und Konkatenieren musst.
z.B. Writeln(32,'test',43); ist kein Problem

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Anfangshürden

Beitrag von AlterMann »

theo hat geschrieben: Mach mal Projekt -> Compilereinstellungen -> Linken bei Win32 GUI Anwendung das Häkchen weg. Dann kriegst du zusätzlich eine Konsole auf die du writeln kanst.
Writeln ist nur schon besser, weil du nicht alles Umwandlen und Konkatenieren musst.
z.B. Writeln(32,'test',43); ist kein Problem
Na das ist ja mal ein Supertipp. :mrgreen:
Ich habe schon um mein gutes altes Writeln von TP geweint.
Hätte nicht gedacht, daß das noch da ist.

Damit ist das merkwürdige Verhalten auch weg.
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfangshürden

Beitrag von theo »

AlterMann hat geschrieben: Ich habe schon um mein gutes altes Writeln von TP geweint.
Hätte nicht gedacht, daß das noch da ist.
Das ist fast alles noch da. Mit dem Freepascal Compiler kann man ja auch weiterhin so arbeiten. http://www.freepascal.org/port.var" onclick="window.open(this.href);return false;
Auch http://www.freepascal.org/docs-html/" onclick="window.open(this.href);return false;

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Anfangshürden

Beitrag von AlterMann »

theo hat geschrieben: Das ist fast alles noch da. Mit dem Freepascal Compiler kann man ja auch weiterhin so arbeiten.
Daß es noch existiert hab ich eh schon gesehen, aber ich konnte mir nicht erklären wo es etwas hinschreiben sollte. :wink:

BTW: Jetzt hab ich eine (diesmal sinnvolle) Showmessge-Routine eingefügt und die schluckt auch wieder meine Eingabe. :evil:
Früher war alles besser. Und aus Holz!

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Anfangshürden

Beitrag von shokwave »

Ich kann's leider nicht nachvollziehen. Hab's grad auf WinXP Prof. mit Laz 0.9.28.2/fpc 2.2.4 und Win7 Laz 0.9.29(r23075)/fpc 2.5.1 probiert. Es läuft auf beiden Systemen fehlerfrei.
mfg Ingo

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Anfangshürden

Beitrag von Hitman »

pluto hat geschrieben:Ich glaube es ist sinnvoller das mit Assigned zu machen. Z.B. so: if Assigned(ListBox) then ....
Assigned bringt in dem Fall nicht viel. Es ist primär für den Fall von Methodenzeigern (also häufig Events [procedure ... of object]) da diese nicht nur aus einem sondern aus zwei Zeigern bestehen - dem auf die Methode und dem auf das Objekt. Assigned prüft dann beide. Für alle anderen Fälle ist es dann lediglich Geschmackssache, was man im Code schöner findet.

Antworten