AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

bessere lösung für prozeduren

Ein Thema von xan553 · begonnen am 28. Okt 2011 · letzter Beitrag vom 29. Okt 2011
Antwort Antwort
xan553

Registriert seit: 29. Jan 2007
32 Beiträge
 
#1

bessere lösung für prozeduren

  Alt 28. Okt 2011, 23:36
servus,

gibt es für solche codepassagen vielleicht bessere lösungen die nicht so massig sind?

Delphi-Quellcode:
procedure TTblLieferanten.setSearchLabels(m: Byte);
begin
  case m of
    1: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.visible := True;Label11.Caption := '2 = Kunden Nr.';
         Label13.visible := True;Label13.Caption := '';
         Label14.visible := True;Label14.Caption := '';
         combobox2.Items.Add('1');
         combobox2.Items.Add('2');
         combobox2.ItemIndex := 0;
       end;
    2: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.visible := True;Label11.Caption := '3 = Artikel Nr.';
         Label13.visible := True;Label13.Caption := '6 = Bezeichnung';
         Label14.visible := True;Label14.Caption := '7 = Lieferanten';
         combobox2.Items.Add('1');
         combobox2.Items.Add('3');
         combobox2.Items.Add('6');
         combobox2.Items.Add('7');
         combobox2.ItemIndex := 0;
       end;
    3: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '2 = Kunden Nr.';
         Label11.visible := True; Label11.Caption := '5 = Rechnungs Nr.';
         Label13.visible := True; Label13.Caption := '';
         Label14.Caption := '';
         combobox2.Items.Add('1');
         combobox2.Items.Add('2');
         combobox2.Items.Add('5');
         combobox2.ItemIndex := 0;
       end;
    4: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.visible := True;Label11.Caption := '2 = Kunden Nr.';
         Label13.visible := True;Label13.Caption := '4 = Auftrags Nr.';
         Label14.Caption := '';
         combobox2.Items.Add('1');
         combobox2.Items.Add('2');
         combobox2.Items.Add('4');
         combobox2.ItemIndex := 0;
       end;
    5: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.Caption := '';
         Label13.Caption := '';
         Label14.Caption := '';
         combobox2.Items.Add('1');
         combobox2.ItemIndex := 0;
       end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.289 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: bessere lösung für prozeduren

  Alt 28. Okt 2011, 23:45
In dem Umfang würde ich es auch so machen.

Bei komplexeren Varianten könnte man die Daten (Visibal, Caption etc.) z.B. in einer Ini bereitstellen, um den Quelltext zu minimieren.
Ansonsten käme noch die Verwendung von PageControls (mit ausgeblendeten Registern) oder eingebette Formulare bzw. Frames in Frage.
Das würde jedoch mehr Aufwand machen, als Deine Lösung.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.973 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: bessere lösung für prozeduren

  Alt 29. Okt 2011, 02:29
0. "m" ist kein guter Name für einen Prozedur-/Funktionsparameter, bitte sprechende Bezeichner verwenden.

1. Nicht einfach Zahlen als Parameter für die case-Anweisung verwenden, sondern einen eigenen Aufzählungstyp verwenden.

2. Combobox2.clear kann vor dem case hingeschrieben werden, da es in allen Fällen vorkommt.

2.1. Ebenso combobox2.ItemIndex := 0, dann aber nach der case-Anweisung.

3. Strings als const oder resource strings am Anfang der Unit deklarieren. Lässt sich so auch besser kombinieren.

4. Combobox2.Items.Delimiter und Combobox2.Items.DelimitedText würde ich mir an deiner Stelle mal ganz genau anschauen.

5. Müssen Labels, die einen leeren String zugewiesen bekommen, wirklich visible sein?

5.1 Müssen unsichtbare Labels einen leeren String zugewiesen bekommen?

6. Das setzen der visible-Eigenschaft für die Labels 10 bis 13 kann vor der case-Anweisung geschehen oder in einer Subroutine gemacht werden.
Nur im letzten Fall kann man die dann explizit unsichtbar setzen (obwohl ohnehin leer).

Bei richtiger Umsetzung werden am Ende dann so rund nur drei bis fünf Anweisungen pro Fall übrigbleiben.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.302 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: bessere lösung für prozeduren

  Alt 29. Okt 2011, 08:47
Ich würde hier schon Code in eine Procedure auslagern...
Delphi-Quellcode:
procedure TTblLieferanten.setSearchLabels(m: Byte);
  procedure SetItem(ALabel: TLabel; const ANr: string = ''; const AFunction:
      string = '');
  begin
    ALabel.Visible := True;
    if AFunction <> 'then
      ALabel.Caption := ANr + ' = ' + AFunction;
    if ANr <> 'then
      Combobox2.Items.Add(ANr);
  end;

begin
  combobox2.Clear;
  case m of
    1:
      begin
        SetItem(Label10, '1', 'Name');
        SetItem(Label11, '2', 'Kunden Nr.');
        SetItem(Label13);
        SetItem(Label14);
      end;
    2: ...
  end;
  combobox2.ItemIndex := 0;
end;
Wichtig sind allerdings auch die Hinweise von TiGü...

Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: bessere lösung für prozeduren

  Alt 29. Okt 2011, 10:26
Hübscher, besser wartbar fände ich etwas in der Art:
Delphi-Quellcode:
implementation

{$R *.dfm}

type
TInfoRec=Record
  Nr:Integer;
  Caption:String;
End;

const
InfoRecArray:Array[1..5,1..4] of TInfoRec=(
                                         (
                                          (Nr : 1;Caption :'Name')
                                          , (Nr : 2;Caption :'Kunden Nr')
                                          , (Nr : -1;Caption :'')
                                          , (Nr : -1;Caption :'')
                                          ),
                                          (
                                          (Nr : 1;Caption :'Name')
                                          , (Nr : 3;Caption :'Artikel Nr')
                                          , (Nr : 6;Caption :'Bezeichnung')
                                          , (Nr : 7;Caption :'Lieferant')
                                          ),
                                          (
                                          (Nr : 2;Caption :'Kunden Nr')
                                          , (Nr : 5;Caption :'Rechnungs Nr')
                                          , (Nr : -1;Caption :'')
                                          , (Nr : -1;Caption :'')
                                          ),
                                          (
                                          (Nr : 1;Caption :'Name')
                                          , (Nr : 2;Caption :'Kunden Nr')
                                          , (Nr : 4;Caption :'Auftrags Nr')
                                          , (Nr : -1;Caption :'')
                                          ),
                                          (
                                          (Nr : 1;Caption :'Name')
                                          , (Nr : -1;Caption :'')
                                          , (Nr : -1;Caption :'')
                                          , (Nr : -1;Caption :'')
                                          ));

procedure TForm1.DisplayArray(Nr:Integer);
var
  i:Integer;
  l:TLabel;
begin
  Combobox1.Items.Clear;
  for I := 1 to 4 do
      begin
         l := TLabel(FindComponent('Label' + IntToStr(i)));
         if Assigned(l) then
            begin
              l.Visible := InfoRecArray[Nr,i].Nr >0;
              l.Caption := IntToStr(InfoRecArray[Nr,i].Nr) + ' = ' + InfoRecArray[Nr,i].Caption;
              if l.Visible then Combobox1.Items.Add(IntToStr(InfoRecArray[Nr,i].Nr));
            end;
      end;
   Combobox1.ItemIndex := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
 DisplayArray(1);
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
8.506 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: bessere lösung für prozeduren

  Alt 29. Okt 2011, 10:42
Theoretisch geht es auch so:
Delphi-Quellcode:
  private
    type
      TLabelMode = (lmCustomerNumber, lmArticleNumber, lmBillNumber, lmOrderNumber, lmName);
    procedure SetSearchLabels(const ALabelMode: TLabelMode);

// ...

procedure TTblLieferanten.SetSearchLabels(const ALabelMode: TLabelMode);
const
  LabelCaptions: array[TLabelMode, 0..3] of string = (
    ('1 = Name', '2 = Kunden Nr.', '', ''),
    ('1 = Name', '3 = Artikel Nr.', '6 = Bezeichnung', '7 = Lieferanten'),
    ('2 = Kunden Nr.', '5 = Rechnungs Nr.', '', ''),
    ('1 = Name', '2 = Kunden Nr.', '4 = Auftrags Nr.', ''),
    ('1 = Name', '', '', '')
  );
  ComboContents: array[TLabelMode] of string = (
    '1'#13#10'2', '1'#13#10'3'#13#10'6'#13#10'7', '2'#13#10'5', '1'#13#10'2'#13#10'4', '1'
  );
begin
  Label10.Caption := LabelCaptions[ALabelMode][0];
  Label11.Caption := LabelCaptions[ALabelMode][1];
  Label13.Caption := LabelCaptions[ALabelMode][2];
  Label14.Caption := LabelCaptions[ALabelMode][3];
  ComboBox2.Items.Text := ComboContents[ALabelMode];
  ComboBox2.ItemIndex := 0;
end;

procedure TTblLieferanten.ComboBox3Change(Sender: TObject);
begin
  setSearchLabels(TLabelMode(ComboBox3.ItemIndex));
end;
Besser wäre es aber erstens die Komponenten ordentlich zu bezeichnen statt so ein Messie-Formular zu benutzen.

Und zweitens wäre es sinnvoller die Bezeichnungen usw. mit der Funktionalität kombiniert in eigene Klassen zu stecken. Dan können die verschiedenen Suchklassen von einer Elternklasse abgeleitet werden und es muss nur die entsprechende abgeleitete Klasse jeweils benutzt werden. Das macht es sehr viel übersichtlicher.

// EDIT:
Wo war der rote Kasten? Da steht ja schon eine ähnliche Lösung (die ich allerdings für unnötig unübersichtlich halte).
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (29. Okt 2011 um 10:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: bessere lösung für prozeduren

  Alt 29. Okt 2011, 11:41
@Jaenicke

Deines ist weniger "kompliziert", wenn die Anforderung kommt direkt über die Beschreibung auszuwählen, also Commbobox oder Radiogroup ohne Lables und sichtbare Zahlen, ist mein Ansatz schneller umgestrickt...


Delphi-Quellcode:
procedure TForm1.DisplayArray2(Nr:Integer);
var
  i:Integer;
begin
  Combobox1.Items.Clear;
  for I := 1 to 4 do
      begin
            if InfoRecArray[Nr,i].Nr>-1 then
              Combobox1.Items.AddObject(InfoRecArray[Nr,i].Caption,TObject( InfoRecArray[Nr,i].Nr));

      end;
   Combobox1.ItemIndex := 0;
end;
Der Zugriff auf die Nummer würde dann per Beispiel
Showmessage(IntToStr(Integer(Combobox1.Items.objects[Combobox1.ItemIndex]))); erfolgen ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
8.506 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: bessere lösung für prozeduren

  Alt 29. Okt 2011, 12:53
Um Metainformationen zu den Items einer ComboBox zu speichern, benutze ich aber lieber generische Ansätze.

Sei es durch einen class helper, der das generisch macht, oder durch ein Dictionary, über das die Informationen zu den visuellen Komponenten abrufbar sind.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf