Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 19.03.11 16:22 
Hi, Delpher,

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

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:
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

_________________
ut vires desint, tamen est laudanda voluntas
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 19.03.11 17:59 
Suche die Gemeinsamkeiten und übergebe die Unterschiede als Parameter.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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;
...
Einloggen, um Attachments anzusehen!
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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

_________________
ut vires desint, tamen est laudanda voluntas
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 20:36 
Ich würde es innerhalb von TBuchMain deklarieren:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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

_________________
ut vires desint, tamen est laudanda voluntas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 22:44 
Du musst das private usw. natürlich nach den Komponenten und Ereignismethoden einfügen... :roll:

Für diesen Beitrag haben gedankt: D. Annies
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 19.03.11 23:06 
Hi, Sebastian,
ich krieg's (noch) nicht gebacken:

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:
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

_________________
ut vires desint, tamen est laudanda voluntas
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Sa 19.03.11 23:19 
ausblenden 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

Für diesen Beitrag haben gedankt: D. Annies
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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

_________________
ut vires desint, tamen est laudanda voluntas
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Sa 19.03.11 23:45 
kein problem, das war niemals böse gemeint :)
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: So 20.03.11 11:09 
Kurze Nachfrage: statt flmMonth kann ich doch auch flmMon sagen, oder?
Eine "einWortAntwort" reicht ...
Detlef

_________________
ut vires desint, tamen est laudanda voluntas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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...
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: So 20.03.11 18:50 
Hi, Sebastian, danke für deine "Nachsorge"
Detlef

_________________
ut vires desint, tamen est laudanda voluntas