Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: So 23.01.11 10:49 
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)

ausblenden Delphi-Quelltext
1:
  i = n++  // soll sagen, i wird der Wert von n übergeben und n incrementiert!					


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:

ausblenden volle Höhe 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:
// Dies ist ein Code-Schnipsel!!

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);  // diese Funktion soll die gewählten Optionen umsetzen (Auswahl der Datensätze)
    end;
  end;
end;

:

// Die verwendete Funktionen sind wie folgt definiert: (Auswaehlen ist hier nicht relevant, soll nur zeigen, dass mit den Optionen etwas passiert!)


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}

function BoolToStr(g: Boolean): string;
begin
  Result := WennDann(g, 'TRUE''FALSE');
end{function}


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.

ausblenden 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.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
    a := Funktion(_inc(k));   // sicherer als:

    a := Funktion(k);  // bei Exception wird inc(k) doch nicht aufgerufen, oder sehe ich das falsch?
    inc(k);

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 23.01.11 21:01 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.