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)
Delphi-Quelltext
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:
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.
Toleranz ist eine Grundvoraussetzung für das Leben.