Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vereinfachung gesucht (https://www.delphipraxis.net/154236-vereinfachung-gesucht.html)

Die Muhkuh 2. Sep 2010 10:14

Delphi-Version: 2005

Vereinfachung gesucht
 
Hi,

ich hab hier in einem Code mehrere Stellen (ca. 30 Stück), die vom Prinzip so aussehen:

Delphi-Quellcode:
if RadioButton1.Checked then
begin
  if CheckBox1.Checked then
    SQL.Add('abc')
  else
  if CheckBox2.Checked then
    SQL.Add('def')
  else
  begin
    SQL.Add('abc');
    SQL.Add('def');
  end;
end;
Hat jemand eine sinnvolle Idee, sich da die Redundanz zu sparen?

himitsu 2. Sep 2010 10:16

AW: Vereinfachung gesucht
 
Können beide CheckBoxen gleichzeitig markiert sein?

wenn nicht:
Delphi-Quellcode:
if RadioButton1.Checked then
begin
  if not CheckBox1.Checked then SQL.Add('def');
  if not CheckBox2.Checked then SQL.Add('abc');
end;
PS:
Delphi-Quellcode:
procedure DoThis(Group: TRadioButton; Check1, Check2: TCheckBox; SQL: TIrgendwas; Add1, Add2: String);
begin
  if Group.Checked then
  begin
    if Check1.Checked then
      SQL.Add(Add1)
    else
    if Check2.Checked then
      SQL.Add(Add2)
    else
    begin
      SQL.Add(Add1);
      SQL.Add(Add2);
    end;
  end;
end;

blackfin 2. Sep 2010 10:26

AW: Vereinfachung gesucht
 
mhm, oder so vielleicht?

Delphi-Quellcode:
var
 mode: Integer;
...
..
begin
 mode := 0 ;
 if CheckBox1.Checked then Inc(mode)
 else if CheckBox2.Checked then mode := mode +2 ;

 if ( (mode = 0) or (mode = 1) ) then SQL.Add('abc') ;
 if ( (mode = 0) or (mode = 2) ) then SQL.Add('def') ;
end;
alternativ auch mit zwei case:

Delphi-Quellcode:
var
 mode: Integer;
...
..
begin
 mode := 0 ;
 if CheckBox1.Checked then Inc(mode)
 else if CheckBox2.Checked then mode := mode +2 ;

 case mode of
   0,1: SQL.Add('abc') ;
 end;

 case mode of
   0,2: SQL.Add('def') ;
 end;
 
end;

Die Muhkuh 2. Sep 2010 10:37

AW: Vereinfachung gesucht
 
Hi,

@Fin: Interessanter Ansatz, schau ich mir gleich mal näher an.

@Frank: Nein, entweder ist keine aktiv oder nur eine davon. Deine erste Methode probier ich auch gleich mal aus.

Die Funktion fällt leider weg, da manchmal 2-3 SQL-Anweisungen kommen oder die Prüfung auf die Checkboxen entfällt.

himitsu 2. Sep 2010 10:38

AW: Vereinfachung gesucht
 
@blackfin: wenn, dann doch eher so: (diese CASE würden es nicht grad vereinfachen)
Delphi-Quellcode:
if RadioButton1.Checked then begin
  if CheckBox1.Checked then mode := 1
  else if CheckBox2.Checked then mode := 2 else mode := 0;
  if mode in [0, 1] then SQL.Add('abc');
  if mode in [0, 2] then SQL.Add('def');
end;

[add]
CheckBoxen optional (einfach nil übergeben) und mehrere Strings:
(kann man auch noch mit überladenen Proceduren und/oder Default-Parametern aufmotzen und mit der "mode"-Variante kombinieren)
Delphi-Quellcode:
procedure DoThis(Group: TRadioButton; Check1, Check2: TCheckBox; SQL: TIrgendwas; Add1, Add2: array of String);
var
  i: Integer;
begin
  if Group.Checked then
    if Assigned(Check1) and Check1.Checked then begin
      for i := 0 to High(Add1) do SQL.Add(Add1[i]);
    end else if Assigned(Check2) and Check2.Checked then begin
      for i := 0 to High(Add2) do SQL.Add(Add2[i]);
    end else begin
      for i := 0 to High(Add1) do SQL.Add(Add1[i]);
      for i := 0 to High(Add2) do SQL.Add(Add2[i]);
    end;
end;
[edit]
Schade,
Delphi-Quellcode:
for Add1 in S do SQL.Add(S);
geht nicht.

blackfin 2. Sep 2010 10:39

AW: Vereinfachung gesucht
 
Stimmt, das ist noch besser :)
Naja, es ging ja in erster Linie um die Redundanz-Vermeidung, das tut mein Code auch, aber deiner ist noch eleganter :D

Die Muhkuh 2. Sep 2010 10:42

AW: Vereinfachung gesucht
 
So, da Franks Lösung funktioniert, brauch ich nicht mehr weiter testen, weil es ja die einfache Lösung ist (hätte fast von mir sein können :stupid: )

himitsu 2. Sep 2010 11:20

AW: Vereinfachung gesucht
 
PS: Noch was zu den CheckBoxen (falls sowas nicht schon eingebaut ist).

So kann man nur eine CheckBox anklicken und vorallem sieht man auch gleich, daß die andere dann nicht mehr geht.
Delphi-Quellcode:
// ins OnClick beider CheckBoxen
procedure TForm9.CheckBox1Click(Sender: TObject);
begin
  CheckBox2.Enabled := not CheckBox1.Checked;
  CheckBox1.Enabled := not CheckBox2.Checked;
end;

Die Muhkuh 2. Sep 2010 11:25

AW: Vereinfachung gesucht
 
Ich verwende die ComboBox von DevExpress, die haben das schon on Board, dass man nur eine klicken kann :-)

DeddyH 2. Sep 2010 12:05

AW: Vereinfachung gesucht
 
Zitat:

Zitat von himitsu (Beitrag 1046953)
Delphi-Quellcode:
// ins OnClick beider CheckBoxen
procedure TForm9.CheckBox1Click(Sender: TObject);
begin
  CheckBox2.Enabled := not CheckBox1.Checked;
  CheckBox1.Enabled := not CheckBox2.Checked;
end;

Und dann im OI beide auf Checked setzen :mrgreen:

[edit] Nee, das bringt ja nix. Spaß macht es nur, wenn man nur eine der beiden im OI checked und die andere dann im OnShow ^^ [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz