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;
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 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; 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; 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 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; 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
Narses: 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 StartDrag : Boolean; type TFilterMode = (flmDay, flmMonth); procedure GebTagMon(Q_sl: TQuery; AFilterMode: TFilterMode); end;
public
end;
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);
|
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 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
@
glotzer: 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; |
@
Detlef: 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!