Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - C-typische Konstrukte in Delphi implementieren
Tranx - So 23.01.11 10:49
Titel: C-typische Konstrukte in Delphi implementieren
Hallo Leute,
mal eine Frage. Gibt es eine Möglichkeit, folgende C-typischen Konstrukte in Delphi zu implementieren? (Ich hoffe, ich gebe sie richtig wieder)
Warum ich das will? Nun, ich habe hier und da durchlaufende Zähler, die in einer For .. to .. Schleife benutzt werden. Und da möchte ich jedesmal, wenn ich etwas durchführen lasse, automatisch den Zähler incrementieren, ohne jedesmal die inc-Prozedur benutzen zu müssen. Ein Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| procedure TAuswF.TransferFilter(Sender: TObject; wie: integer); var i, j, k: integer; Tclb: TChecklistbox; TC: TComponent; begin with Mem_Filter.Lines do begin if wie = exportieren then begin Clear; for i := 0 to AuswF.ComponentCount - 1 do begin if AuswF.Components[i].Tag = 99 then begin TC := AuswF.Components[i]; if AuswF.Components[i] is TCheckbox then begin Add(BoolToStr(TCheckBox(TC).checked)); end else if TC is TEdit then begin Add(TEdit(TC).Text); end else if TC is TMaskEdit then begin Add(TMaskEdit(TC).Text); end else if TC is TChecklistBox then begin Tclb := TChecklistBox(TC); for j := 0 to Tclb.Items.Count - 1 do Add(BoolToStr(Tclb.checked[j])); end else if TC is TCombobox then begin Add(TCombobox(TC).Text); end; end; end; end else begin k := 0; for i := 0 to AuswF.ComponentCount - 1 do begin TC := AuswF.Components[i]; if TC.Tag = 99 then begin if TC is TCheckbox then begin TCheckBox(TC).checked := StrToBool(Strings[_inc(k)]); end else if TC is TEdit then begin TEdit(TC).Text := Strings[_inc(k)]; end else if TC is TMaskEdit then begin TMaskEdit(TC).Text := Strings[_inc(k)]; end else if TC is TChecklistBox then begin Tclb := TChecklistBox(TC); for j := 0 to Tclb.Items.Count - 1 do begin Tclb.checked[j] := StrToBool(Strings[_inc(k)]); end; end else if TC is TCombobox then begin TCombobox(TC).Text := Strings[_inc(k)]; end; end; end; Auswaehlen(Sender); end; end; end;
:
function WennDann(Bedingung: boolean; wenn, dann: Variant): variant; begin if Bedingung then Result := wenn else Result := dann; end;
function _inc(var Value : longint; const n : integer = 1) : longint; begin Result := Value; inc(Value,n); end;
function StrToBool(s: string): Boolean; begin result := (UpperStr(s) = 'TRUE'); end;
function BoolToStr(g: Boolean): string; begin Result := WennDann(g, 'TRUE', 'FALSE'); end; |
Was soll die Prozedur tun? Alle Komponenten eines Formulars durchgehen und testen, ob deren TAG 99 ist. Dann diese Komponente entsprechend ihrer Klasse behandeln und in ein Memofeld die Daten speichern. Dieses Memofeld wird dann in einer Textdatei gespeichert und kann entsprechend wieder geladen werden.
Da einige Optionen mehrere Einträge haben (z.B. TChecklistbox) brauche ich zwei Zähler (i und k). Bisher habe ich es so gelöst. Es funktioniert. Aber es wäre ja schöner, es wie in C zu machen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| : else if TC is TCombobox then begin TCombobox(TC).Text := Strings[k++]; end; : |
Wie gesagt, ich hoffe, das C-Konstrukt richtig wiedergegeben zu haben, bin leider kein C-Programmierer.
jaenicke - So 23.01.11 11:01
// EDIT:
Ich sehe grad, du hast ja schon ein eigenes Inc-Konstrukt.
Die Lesbarkeit des Quelltextes fördert so etwas überhaupt nicht, weshalb ich sowas auch nie selbst machen würde. Und deshalb finde ich es auch gut, dass es genau das in Delphi nicht gibt.
Jedenfalls wirst du so etwas wie ++ oder so in Delphi nicht direkt nachbauen können.
Tranx - So 23.01.11 11:13
Sicher, diese Konstrukte sind nicht gerade förderlich beim Lesen. Doch - in dem Fall tritt das Problem wohl eher nciht auf - was ist, wenn eine Exception auftritt und ich dennoch die inkrementierte Zahl benötige. Dann ist eine Programmfolge:
Delphi-Quelltext
1: 2: 3: 4:
| a := Funktion(_inc(k)); a := Funktion(k); inc(k); |
jaenicke - So 23.01.11 11:59
Wenn da eine Exception auftreten kann, ist das so unter der Voraussetzung, dass in jedem Fall inkrementiert werden soll, ja auch ein Programmierfehler...
Delphi-Quelltext
1: 2: 3: 4: 5:
| try a := Funktion(k); finally Inc(k); end; |
Der Code danach, in dem k dann wohl benutzt wird, wird aber eh nicht ausgeführt, wenn du kein try..except benutzt.
delfiphan - So 23.01.11 21:01
Tranx hat folgendes geschrieben : |
| Gibt es eine Möglichkeit, folgende C-typischen Konstrukte in Delphi zu implementieren? |
Das hast du mit deinem Inc_ ja bereits gemacht. Ausserdem bricht deine Schleife sowieso ab, sobald eine Exception passiert. Da dein k eine lokale Variable ist, ist der Wert sowieso weg.
Bei Operationen sollte man Code möglichst so schreiben, dass sie eine Transaktion darstellen. Entweder laufen sie durch oder sie geben einen Fehler oder Exception zurück. Im Fall einer Exception soll man davon ausgehen können, dass nichts geändert wurde. Wenn du das Objekt nur halbwegs verändert lässt, kann das schnell mal zu unerwarteten Situationen oder Sicherheitsproblemen führen.
Tranx - So 23.01.11 21:07
Sicher, im gegebenen Fall wäre das so, aber bei einer globalen Variablen wäre das sicher anders.
Ich schrieb ja schon, dass das Problem beim vorliegenden Beispiel nicht auftritt, da eigentlich keine Exception auftreten dürfte.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!