Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   If Anweisungen verkleinern (https://www.delphipraxis.net/133834-if-anweisungen-verkleinern.html)

youuu 10. Mai 2009 10:31


If Anweisungen verkleinern
 
Hi,
kann mir jemand einen Tipp geben wie ich diesen Quelltext verkleinern kann.
Ich empfinde diesen Code nicht sonderlich schön.


Delphi-Quellcode:
if Customer_Info[1,28,1] = 'Klein' then
    Begin
      ComboBoxFirmenG.Items.Add('Mittel');
      ComboBoxFirmenG.Items.Add('Groß');
    End
    Else if Customer_Info[1,28,1] = 'Mittel' then
    Begin
      ComboBoxFirmenG.Items.Add('Klein');
      ComboBoxFirmenG.Items.Add('Groß');
    End
    Else if Customer_Info[1,28,1] = 'Groß' then
    Begin
      ComboBoxFirmenG.Items.Add('Klein');
      ComboBoxFirmenG.Items.Add('Mittel');
    End
    Else
    Begin
      ComboBoxFirmenG.Items.Add('Klein');
      ComboBoxFirmenG.Items.Add('Mittel');
      ComboBoxFirmenG.Items.Add('Groß');
    End;

Meflin 10. Mai 2009 10:36

Re: If Anweisungen verkleinern
 
du definierst dein Customer-Info nicht als string, sondenr machst eine eigene Enum dafür...
Delphi-Quellcode:
type
  TCustomerInfoSize = (ciSmall, ciMedium, ciLarge)
Oder wie du es eben brauchst ;)

und dann kannst du einfach case...of verwenden:
Delphi-Quellcode:
case Customer_Info[1,28,1] of
  ciSmall: begin ... end;
  ciMedium: begin ... end;
  ciLarge: begin ... end;
end;

youuu 10. Mai 2009 10:46

Re: If Anweisungen verkleinern
 
Zitat:

Zitat von Meflin
du definierst dein Customer-Info nicht als string, sondenr machst eine eigene Enum dafür...
Delphi-Quellcode:
type
  TCustomerInfoSize = (ciSmall, ciMedium, ciLarge)
Oder wie du es eben brauchst ;)

und dann kannst du einfach case...of verwenden:
Delphi-Quellcode:
case Customer_Info[1,28,1] of
  ciSmall: begin ... end;
  ciMedium: begin ... end;
  ciLarge: begin ... end;
end;

Im Array Customer-Info sind mehrere Daten gespeichert, als nur die Größe, ich kann also nicht das ganze Array umwandeln.
Oder wie hattest du es gemeint?

Für mich ist das neu, habe damit noch nicht's zu tun gehabt.

Könntest du mir dies einmal zum verstehen erklären?

Apollonius 10. Mai 2009 10:47

Re: If Anweisungen verkleinern
 
Etwas weniger abstrahiert könntest du auch erst alle Strings hinzufügen und dann mit TStrings.Remove den Inhalt des Felds wieder entfernen (sofern die Combobox vorher leer ist, wovon ich ausgehe).

youuu 10. Mai 2009 10:51

Re: If Anweisungen verkleinern
 
Habe nun:

Delphi-Quellcode:
type
  TCustomerInfoSize = (ciKlein, ciMittel, ciGroß);

.
.
.

case Customer_Info[1,28,1] of
    ciKlein: begin
      ComboBoxFirmenG.Items.Add('Mittel');
      ComboBoxFirmenG.Items.Add('Groß');
    end;
    ciMittel: begin
      ComboBoxFirmenG.Items.Add('Klein');
      ComboBoxFirmenG.Items.Add('Groß');
    end;
    ciGroß: begin
      ComboBoxFirmenG.Items.Add('Klein');
      ComboBoxFirmenG.Items.Add('Mittel');
    end;
end;
Alleridngs kommt da: "Inkompatible Typen: Integer und TCustomerInfoSize"

Meflin 10. Mai 2009 10:53

Re: If Anweisungen verkleinern
 
Du hast dein array Customer-Info (wie das genau aussieht kann man ja nur raten, ich vermute mal hier wären records eh angebrachter als ein 3-Dimensionales array :gruebel: aber egal, in diesem array gibt es eine "Spalte" in der du offensichtlich die strings "Klein", "Mittel" und "Groß" speicherst.

Das machst du nun nicht mehr, sondern speicherst in dieser Spalte den Wert ciSmall usw.

Und da es den Typ ciSmall noch nicht gibt, musst du ihn definieren, mit hilfe einer Enumeration. Syntax steht ja in meinem ersten Beitrag.

Wie gesagt, höchstwahrscheinlich wäre aber sowas in der Art eh besser:

Delphi-Quellcode:
TCustomerInfoSize = (ciSmall, ciMedium, ciLarge);

TCustomerInfo = record
begin
  Size: TCustomerInfoSize;
  ... // deine sonstigen Customer Infos
end;

CustomerInfos = array of TCustomerInfo;
ist doch viel schöner, als ein 3-Dimensionales array, in dem auch noch alles unnötigerweise als string gespeichert wird ;)

Meflin 10. Mai 2009 10:56

Re: If Anweisungen verkleinern
 
Zitat:

Zitat von youuu
Alleridngs kommt da: "Inkompatible Typen: Integer und TCustomerInfoSize"

Wo denn? Beim case...of? Dann hast du im array nicht den richtigen Datentyp (TCustomerInfoSize) verwendet.

youuu 10. Mai 2009 11:00

Re: If Anweisungen verkleinern
 
Ich habe es so bis jetzt gehabt:

Delphi-Quellcode:
customer_info: array [0..10, 0..40] of string;

QueryCustomer.SQL.Text:='SELECT * FROM `'+Table_Info[5,1]+'` WHERE customer_company_name='''+FormMain.StringGridKunden.Cells[0,selectedRow]+'''';
QueryCustomer.Open;
for i := 0 to StrToInt(Table_Info[5,2]) - 1 do
  Customer_Info[1,i, 1] := QueryCustomer.Fields[i].Asstring;
QueryCustomer.Close;
Wobei im Array
[a,b]

a = Die verschiedenen Tabellen Daten 1: Customer
b = verschiedenen Einträge der Tabellen



Habe es wieder in 2 Dimensional geändert, da 3 Dimensional überflüssig wurde und ich vergessen hatte es zu ändern.

mjustin 10. Mai 2009 11:10

Re: If Anweisungen verkleinern
 
Schritt 0: Deklaration der Aufzählungstypen und eines Sets:

Delphi-Quellcode:
type
  TSize = (ciKlein, ciMittel, ciGroß);
  TSizes = set of TSize;
var
  Sizes: TSizes;
Schritt 1: Mapping von String auf den Aufzählungstyp, in Set aufnehmen

Delphi-Quellcode:
if Customer_Info[1,28,1] = 'Klein' then
  Include(Sizes, ciKlein)
else if Customer_Info[1,28,1] = 'Mittel' then
  Include(Sizes, ciMittel)
else if Customer_Info[1,28,1] = 'Groß' then
  Include(Sizes, ciGroß);
Schritt 2: ein, zwei oder drei Items der Stringlist hinzufügen

Delphi-Quellcode:
if not (ciKlein in Sizes) then
  ComboBoxFirmenG.Items.Add('Klein');

if not (ciMittel in Sizes) then
  ComboBoxFirmenG.Items.Add('Mittel');

if not (ciGroß in Sizes) then
  ComboBoxFirmenG.Items.Add('Groß');

youuu 10. Mai 2009 11:18

Re: If Anweisungen verkleinern
 
wobei ich dann, aber wieder genauso viel Text besitze und der Code nicht wirklich kleiner geworden ist?
Oder Irre ich mich?

Delphi-Quellcode:
ComboBoxFirmenG.Text := Customer_Info[1,28];

  if Customer_Info[1,28] = 'Klein' then
    Include(Sizes, ciKlein)
  else if Customer_Info[1,28] = 'Mittel' then
    Include(Sizes, ciMittel)
  else if Customer_Info[1,28] = 'Groß' then
    Include(Sizes, ciGroß);


  if ciKlein in Sizes then
  Begin
    ComboBoxFirmenG.Items.Add('Mittel');
    ComboBoxFirmenG.Items.Add('Groß');
  End
  Else if ciMittel in Sizes then
  Begin
    ComboBoxFirmenG.Items.Add('Klein');
    ComboBoxFirmenG.Items.Add('Groß');
  End
  Else if ciGroß in Sizes then
  Begin
    ComboBoxFirmenG.Items.Add('Klein');
    ComboBoxFirmenG.Items.Add('Mittel');
  End
  Else
  Begin
    ComboBoxFirmenG.Items.Add('Klein');
    ComboBoxFirmenG.Items.Add('Mittel');
    ComboBoxFirmenG.Items.Add('Groß')
  End;
Denn es sollen ja die Items geadded werden die nicht im Feld "Customer_Info[1,28]" gespeichert sind.

Und somit habe ich wieder die nervigen If Anweisungen :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 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