Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Codevereinfachung


D. Annies - Sa 19.03.11 16:22
Titel: Codevereinfachung
Hi, Delpher,

wie kann man den nachfolgenden Code, der in den beiden Procs ja seehr ähnlich ist, vereinfachen?


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:
procedure TBuchMain.GebTag(Q_sl: TQuery);
var mo, tg : integer;
    tbname : string;
begin
  Mo := strtoint(copy(maskedit1.editText,4,2));
  Tg := strtoint(copy(maskedit1.editText,1,2));
  tbname := combobox2.Items[combobox2.itemindex];
  Q_sl.close;
              {if Q_sl.DatabaseName = '' then  // bzw. wenn GEBDAT ein STRING ist!
               begin
                 Q_sl.sql.text := format('select Name, Vorname, Gebdat, Telefon from "%s" ' +
                 ' where GEBDAT LIKE :DATUM order by Name', [TbLk.tablename]);
                 Q_sl.ParamByName('DATUM').asstring := maskedit1.editText + '%';
               end;}


  Q_sl.sql.text :=
    format('select Name, Vorname, Klasse, Telefon, Gebdat from "%s" ' +
           'where MONTH(gebdat) = :MONAT and DAY(gebdat) = :TAG ' +
           'order by Name, Vorname, Klasse', [TbName]);
      Q_sl.ParamByName('Monat').asinteger := Mo;
      Q_sl.ParamByName('Tag').asinteger := Tg;
  Q_sl.open;
  tntstringgrid1.RowCount := 2;
  TeilMengenausgabeSG(Q_sl);
  Splitter2Moved(Self);
  if Q_sl.RecordCount > 0 then
  begin               // Vorangestellte Nullen: Format('%.03d', [Z]); -> 003, 019, 113
    fname := concat(label30.caption, 'OUTXLS\Geburtstag_'+tbname);
    fname := fname + format('%.02d', [tg])+ format('%.02d', [mo])+ '.xls';
    bericht := bericht + #13#13'Alles Gute zum Geburtstag!' + #13;
    checkbox11.Checked := true; checkbox11click(self);
  end
  else
  begin
    bericht := bericht + #13#13'Die Geburtstagsliste der Schule ist heute leer!' + #13;
    //application.MessageBox(#13+ '--Alles Gute zum Geburtstag!--', 'Geburtstagsliste');
    fname := 'Dummy.xls';
  end;
  tntstringgrid1.Hint := fname;
  if combobox2.ItemIndex = 0 then qLkSort(self); ///// !!!!!
  if combobox2.ItemIndex = 1 then qschuelersort(self);
  MaskEdit1.Text := format('%2d', [t]) + '.' + format('%2d', [m]) + '.';
end;

procedure TBuchMain.GebMon(Q_sl: TQuery);
var mo, tg : integer;
   tbname :  string;
begin
  Mo := strtoint(copy(maskedit1.editText, 4,2));
  Tg := strtoint(copy(maskedit1.editText, 1,2));
  tbname := combobox2.Items[combobox2.itemindex];
  Q_sl.close; {if Q_sl.DatabaseName = '' then  // bzw. wenn GEBDAT ein STRING ist!
               begin
                 Q_sl.sql.text := format('select Name, Vorname, Gebdat, Telefon from "%s" ' +
                 ' where GEBDAT LIKE :DATUM order by Name', [TbLk.tablename]);
                 Q_sl.ParamByName('DATUM').asstring := maskedit1.editText + '%';
               end;}

    Q_sl.sql.text :=
      format('select Name, Vorname, Klasse, Telefon, Gebdat from "%s" ' +
             'where MONTH(gebdat) = :MONAT ' +
             'order by Name, Vorname, Klasse, Gebdat', [TbName]);
      Q_sl.ParamByName('Monat').asinteger := Mo;
  Q_sl.open;
  tntstringgrid1.RowCount := 2;
  TeilMengenausgabeSG(Q_sl);
  Splitter2Moved(Self);
  if Q_sl.RecordCount > 0 then
  begin     // Vorangestellte Nullen: Format('%.03d', [Z]); -> 003, 019, 113
    fname := concat(label30.caption, 'OUTXLS\Geburtstag_'+tbname);
    fname := fname + format('%.02d', [tg])+ format('%.02d', [mo])+ '.xls';
    bericht := bericht + #13#13'Alles Gute zum Geburtstag!' + #13;
    checkbox11.Checked := true; checkbox11click(self);
      //application.MessageBox(#13+ '--Alles Gute zum Geburtstag!--', 'Geburtstagsliste');
  end
  else
  begin
    bericht := bericht + #13#13'Die Geburtstagsliste der Schule ist heute leer!' + #13;
    //application.MessageBox(#13+ '--Alles Gute zum Geburtstag!--', 'Geburtstagsliste');
    fname := 'Dummy.xls';
  end;
  tntstringgrid1.Hint := fname;
  if combobox2.ItemIndex = 0 then qLkSort(self); ///// !!!!!
  if combobox2.ItemIndex = 1 then qschuelersort(self);
  MaskEdit1.Text := format('%2d', [t]) + '.' + format('%2d', [m]) + '.';
end;


Vielen Dank für eine gute Idee,
Detlef


Delete - Sa 19.03.11 17:59

Suche die Gemeinsamkeiten und übergebe die Unterschiede als Parameter.


jaenicke - Sa 19.03.11 18:24

Der Unterschied liegt ja nur im Filter der SQL-Abfrage, wie man leicht sieht, siehe Anhang. Das heißt du brauchst doch nur einen zusätzlichen Parameter, der dir anzeigt welcher Filter gesetzt werden soll:

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:
TFilterMode = (flmDay, flmMonth);

procedure TBuchMain.GebTag(Q_sl: TQuery; AFilterMode: TFilterMode);
var
  FilterText: string;
begin
  case FilterMode of
    flmDay:
      FilterText := 'where MONTH(gebdat) = :MONAT and DAY(gebdat) = :TAG ' +
        'order by Name, Vorname, Klasse';
    flmMonth:
      FilterText := 'where MONTH(gebdat) = :MONAT ' +
        'order by Name, Vorname, Klasse, Gebdat';
  else
    FilterText := '';
  end;
...
    Q_sl.SQL.Text := Format('select Name, Vorname, Klasse, Telefon, Gebdat from "%s" '
      + FilterText, [TbName]);
...
    if AFilterMode = flmDay then
      Q_sl.ParamByName('Tag').AsInteger := Tg;
...


D. Annies - Sa 19.03.11 18:55

Hi, Sebastian, sieht toll aus!!
Werde ich gleich mal eingeben! (und mich dann bedanken .. ;))
Danke, Detlef

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hmm, an welcher Stelle genau muss ich den Filter "typen"?
Gruß, Detlef


Delete - Sa 19.03.11 20:28

Natürlich in der Sichtbarkeit der Routinen und der aufrufenden Routine. Da man nicht sehen kann, wie der Rest aufgebaut ist, kann man da nicht viel mehr zu sagen.


jaenicke - Sa 19.03.11 20:36

Ich würde es innerhalb von TBuchMain deklarieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TBuchMain = class...
  private
    type
      TFilterMode = (flmDay, flmMonth);
  private
    procedure GebTag(Q_sl: TQuery; AFilterMode: TFilterMode);
  end;


D. Annies - Sa 19.03.11 21:56

Au weiah: Fehlermeldung: die Methode FormCreate, auf die FormMain.OnCreate verweist, existiert nicht.
Soll der Verweis entfernt werden?
Detlef


jaenicke - Sa 19.03.11 22:44

Du musst das private usw. natürlich nach den Komponenten und Ereignismethoden einfügen... :roll:


D. Annies - Sa 19.03.11 23:06

Hi, Sebastian,
ich krieg's (noch) nicht gebacken:


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:
type
  TBuchMain = class(TForm)
    //  ...
    procedure ZeigeStringListe(sender:Tobject);
    procedure Button2Click(Sender: TObject);
    procedure Zeilelschen1Click(Sender: TObject);
    procedure Zeilehinzufgen1Click(Sender: TObject);
    procedure tnt1init(sender:Tobject);

  private  { Private-Deklarationen }
    StartDrag : Boolean;
    type TFilterMode = (flmDay, flmMonth);
    procedure GebTagMon(Q_sl: TQuery; AFilterMode: TFilterMode);
  end;

  public   { Public-Deklarationen }

  end;

    // Hier wird eine neue Klasse definiert, um nicht immer alles schreiben zu müssen:
  TOpenOffice = class
    public
      servicemanager: Variant;
      desktop: Variant;
      corereflection: Variant;
      dispatcherhelper: Variant;
    constructor Create;
  end;

const
  FONT_WEIGHT :      record
                       DONTKNOW,
                       THIN,
                       ULTRALIGHT,
                       LIGHT,
                       SEMILIGHT,
                       NORMAL,
                       SEMIBOLD,
                       BOLD,
                       ULTRABOLD,
                       BLACK       : extended;
                     end = (DONTKNOW: 0.000000; THIN: 50.000000; ULTRALIGHT: 60.000000;
                            LIGHT: 75.000000; SEMILIGHT: 90.000000; NORMAL: 100.000000; SEMIBOLD:110.000000;
                            BOLD: 150.000000; ULTRABOLD: 175.000000; BLACK: 200.000000);

// usw. ...


Hast du noch einmal Geduld?
Detlef


glotzer - Sa 19.03.11 23:19


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
[...]
type
  TFilterMode = (flmDay, flmMonth);
  TBuchMain = class(TForm)
[...]
    procedure ZeigeStringListe(sender:Tobject);
    procedure Button2Click(Sender: TObject);
    procedure Zeilelschen1Click(Sender: TObject);
    procedure Zeilehinzufgen1Click(Sender: TObject);
    procedure tnt1init(sender:Tobject);

  private  { Private-Deklarationen }
    StartDrag : Boolean;
    procedure GebTagMon(Q_sl: TQuery; AFilterMode: TFilterMode);
  end;
[...]


das lachen heb ich mir mal für später auf rofl


D. Annies - Sa 19.03.11 23:29

Hi, glotzer,
da hast du ja sehr gut hingesehen :) aber bedenke: wenn man etwas noch nie gemacht hat, und die Erklärung
etwas "luschig" gegeben wird, kriegt man es nicht hin. Nun kenne ich die richtige Reihenfolge - Danke
Detlef


glotzer - Sa 19.03.11 23:45

kein problem, das war niemals böse gemeint :)


D. Annies - So 20.03.11 11:09

Kurze Nachfrage: statt flmMonth kann ich doch auch flmMon sagen, oder?
Eine "einWortAntwort" reicht ...
Detlef


jaenicke - So 20.03.11 14:24

@user profile iconglotzer: Ich meinte das anders, so ist die Deklaration nicht an die Klasse gebunden. Das gibt nur Unordnung. Ich meinte das so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
  TBuchMain = class(TForm)
    //  ...
    procedure ZeigeStringListe(sender:Tobject);
    procedure Button2Click(Sender: TObject);
    procedure Zeilelschen1Click(Sender: TObject);
    procedure Zeilehinzufgen1Click(Sender: TObject);
    procedure tnt1init(sender:Tobject);

  private
    type
      TFilterMode = (flmDay, flmMonth);
  private
    StartDrag : Boolean;
    procedure GebTagMon(Q_sl: TQuery; AFilterMode: TFilterMode);
  public
  end;
@user profile iconDetlef: Ich habe das nicht umsonst so geschrieben...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TBuchMain = class...
  private
    type

      TFilterMode = (flmDay, flmMonth);
  private
    procedure GebTag(Q_sl: TQuery; AFilterMode: TFilterMode);
  end;
Durch das type startest du eine Typdeklarationssektion. Das kannst du nicht einfach mit anderen Sachen mischen. Vorher kannst du andere Deklarationen schreiben, aber nicht nach dem type. Da musst du zuerst noch einmal private hinschreiben.

Wie du das nennst, ob nun flmMonth oder anders ist egal, ich halte nur nichts davon unnötig abzukürzen, wenn die Bezeichner ohnehin schon sehr kurz sind...


D. Annies - So 20.03.11 18:50

Hi, Sebastian, danke für deine "Nachsorge"
Detlef