Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Prozeduren, Vereinfachung möglich?
D. Annies - Di 07.04.09 10:50
Titel: Prozeduren, Vereinfachung möglich?
Hi, Delpher,
ich habe folgende sehr ähnliche Prozeduren, die von Popup's auf verschiedenen DBGrids aufgerufen werden.
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:
| procedure TForm1.Excel2Click(Sender: TObject); begin fname := concat(label30.caption, 'OUTXLS\Liste der Lehrkräfte.xls'); if Excel_vorhanden then begin if fileexists(fname) then excelstart(self); if not fileexists(fname) or exneu then begin Excel_Layout1(self); Qx2Excel(QLk); excel.activeworkbook.saveas(fname); Excel_Layout2(self); end; excel.visible := true; end; end;
procedure TForm1.Excel4Click(Sender: TObject); begin fname := concat(label30.caption, 'OUTXLS\Schülerliste.xls'); if Excel_vorhanden then begin if fileexists(fname) then excelstart(self); if not fileexists(fname) or exneu then begin Excel_Layout1(self); Qx2Excel(QSchueler); excel.activeworkbook.saveas(fname); Excel_Layout2(self); end; excel.visible := true; end; end; |
Es müsste doch möglich sein, daraus e i n e Proc zu machen, aber mit welchen Übergabeparametern? Wahrscheinlich reicht der Name des DBGrids, denn darunter liegt die Datasource und den Dateinamen kann ich mir dann auch basteln.
Da muss ich wohl basteln mit extractfilename und extractfileextension und Anhängen der Endung '.xls'.
Danke für Hilfe,
Detlef
D. Annies - Di 07.04.09 11:14
By the way,
wie bekomme ich denn zu dem aufgerufenen Popupmenu die Komponente raus, mit der es verbunden ist? popupmenu6.Owner.Name liefert leider nur Form1, ich möchte aber z.B. DBGrid4 haben.
Ich glaube, dann käme ich weiter.
Detlef
BenBE - Di 07.04.09 12:07
Über den Sender bekommst Du den geklickten Item. Über diesen sollte sich auch das zugehörige Popup finden lassen, wenn Du die Items nicht zwischen den Menüs sharest ...
Nico72 - Di 07.04.09 12:21
Hallo,
schau dir mal die TPopupMenu.PopupComponent Eigenschaft an.
D. Annies - Di 07.04.09 19:09
Hallo, ihr zwei,
leider ging bei mir in der Straße seit ca. 11.15 das Internet/Telefon nicht wegen Wartungsarbeiten, deshalb meine verspätete Antwort.
Nun, leider komme ich mit euren Tipps nicht weiter. Ich habe z.B. DBGrid3 mit Popup4 und DBGrid6 mit Popup8 verbunden. Wie kriege ich also allgemein raus, welches DBGrid (welche Komponente) sich hinter welchem Popupmenu "versteckt"?
Gruß, Detlef
D. Annies - Di 07.04.09 19:15
Scusi, also z.B. mit popupmenu6.popupcomponent.NAME.
Danke, Detlef
D. Annies - Di 07.04.09 19:21
Autsch, leider zu früh gefreut, folgendes geht nicht:
popupmenu6.popupComponent.Name.Datasource.Dataset
hier hatte ich erwartet, dass ich auf die verschiedenen Datasets zugreifen könnte.
Wie geht das denn?
Detlef
BenBE - Di 07.04.09 19:47
D. Annies hat folgendes geschrieben : |
Autsch, leider zu früh gefreut, folgendes geht nicht:
Delphi-Quelltext 1:
| popupmenu6.popupComponent.Name.Datasource.Dataset |
hier hatte ich erwartet, dass ich auf die verschiedenen Datasets zugreifen könnte.
Wie geht das denn?
Detlef |
Dann versuch doch mal:
Delphi-Quelltext
1:
| TDBGrid(popupmenu6.popupComponent).Datasource.Dataset |
bzw. eigentlich ja:
Delphi-Quelltext
1:
| TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset |
;-)
D. Annies - Di 07.04.09 21:08
Hi Benny, das ist klasse! - aber, das folgende funzt nicht:
Qx2Excel(TDBGrid(popupmenu6.popupComponent).Datasource.Dataset); // = QLk!
Gemeint ist: Eine beliebige Query = Qx to = 2 Excel(die Query, z.B. QLk)
[Ich übergebe also mit Qx2Excel eine beliebige Query an Excel]
So kommt noch die Fehlermeldung: Inkompatible Typen TQuery und TDataset.
Kannst du noch mal helfen?
Detlef
BenBE - Di 07.04.09 21:24
Das Dataset-Property liefert dir ein TDataset (wie der Name sagt. Entweder deine Prozedur auf TDataset in den Parametern umschreiben, oder noch diesen zusätzlichen Typecast ergänzen ;-)
D. Annies - Di 07.04.09 21:32
Hi Benny,
meine Proc wollte ich nicht umschreiben: z.B. Qx2Excel(QLk); ist doch schön
aber wie muss ich denn das andere von dir gemeinte umsetzen?
Detlef
D. Annies - Mi 08.04.09 07:47
Hi, ich habe jetzt mal die Proc auf TDataset umgeschrieben - aber gleiches Bild, gleicher Ton. Im Übrigen dachte ich, dass eine Query auch ein Dataset ist, aber das scheint falsch zu sein.
Wie muss ich Benny's Idee umsetzen? Das Internet hat mir keinen Aufschluss gegeben.
Gruß, Detlef
---
Moderiert von
Narses: Beiträge zusammengefasst---
Hi, Benny,
wäre schön, wenn du jetzt Licht in's Dunkel bringen könntest - du scheinst ja hier voll das Expertenwissen zu haben ich hingegen zur Zeit: :nixweiss:
Bis benny äh, denne
Detlef
D. Annies - Do 09.04.09 09:02
Hat denn keiner eine Lösung / Antwort - auch wenn sie lauten würde: es geht nicht mit D6!
So stochere ich im Nebel (auch bei Seiten aus China, die ich schon gelesen habe)
Gruß, Detlef
P.S. autsch, habe eben erst die PN gelesen, meine Aktivität ist so aber nicht gemeint.
BenBE - Do 09.04.09 10:46
Poste mal bitte deinen aktuellen Stand (aufgerufene Funktion + aufrufende Prozedur (jeweils relevante Teile). Hab derzeit Delphi nicht bei der Hand, müsste da erst was nachgucken...
D. Annies - Do 09.04.09 11:21
Hi, Benny:
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:
| procedure TForm1.Excel2Click(Sender: TObject); begin fname := concat(label30.caption, 'OUTXLS\' + extractfilename(changefileext(TbLk.TableName, '.xls'))); if Excel_vorhanden then begin if fileexists(fname) then excelstart(self); if not fileexists(fname) or exneu then begin Excel_Layout1(self); Qx2Excel(QLk); excel.activeworkbook.saveas(fname); Excel_Layout2(self); end; excel.visible := true; end; end;
procedure TForm1.Excel4Click(Sender: TObject); begin fname := concat(label30.caption, 'OUTXLS\Schülerliste.xls'); if Excel_vorhanden then begin if fileexists(fname) then excelstart(self); if not fileexists(fname) or exneu then begin Excel_Layout1(self); Qx2Excel(QSchueler); excel.activeworkbook.saveas(fname); Excel_Layout2(self); end; excel.visible := true; end; end;
procedure TForm1.Qx2Excel(Qx:TQuery); var i, j : integer; begin rce := Qx.RecordCount; rre := Qx.FieldCount; for j := 0 to Qx.FieldCount-1 do excel.cells[1,j+1] := Qx.fields[j].fieldname; Qx.First; i := 2; qx.DisableControls; screen.Cursor := crhourglass; while not Qx.Eof do begin for j := 0 to Qx.fieldcount-1 do begin if pos('preis', lowercase(Qx.Fields[j].FieldName)) > 0 then excel.cells[i,j+1] := Qx.Fields[j].ascurrency else if pos('isbn', lowercase(Qx.Fields[j].FieldName)) > 0 then excel.cells[i,j+1] := '''' + Qx.Fields[j].asstring else excel.cells[i,j+1] := Qx.Fields[j].asstring end; inc(i); Qx.Next; end; excel.Columns.AutoFit; qx.EnableControls; screen.Cursor := crDefault; end; |
Denk dir bitte bei Excel2click() alle wegkommentierten Zeilen weg, das waren nur Versuche von mir.
Detlef
BenBE - Do 09.04.09 11:31
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:
| procedure TForm1.Excel2Click(Sender: TObject); var qxyz : TQuery; begin fname := concat(label30.caption, 'OUTXLS\' + extractfilename(changefileext(TbLk.TableName, '.xls'))); if Excel_vorhanden then begin if fileexists(fname) then excelstart(self); if not fileexists(fname) or exneu then begin Excel_Layout1(self); qxyz := TQuery(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);
Qx2Excel(QLk); excel.activeworkbook.saveas(fname); Excel_Layout2(self); end; excel.visible := true; end; end; |
| Zitat: |
| Denk dir bitte bei Excel2click() alle wegkommentierten Zeilen weg, das waren nur Versuche von mir. |
Warum löschst Du sie dann nicht einfach ;-)
Änderungen markiert. HTH ;-)
Moderiert von
Narses: Zitat repariert
D. Annies - Do 09.04.09 12:33
Hi, Benny,
leider funktioniert es nicht - zur Laufzeit gibt es einen EAccessViolation Error 004D5B20 an Adresse 000002BC.
Detlef :cry: (im Gegensatz zu deinem Smiley)
Nico72 - Do 09.04.09 12:44
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:
| procedure TForm1.Excel2Click(Sender: TObject); var qxyz : TQuery; begin fname := concat(label30.caption, 'OUTXLS\' + extractfilename(changefileext(TbLk.TableName, '.xls'))); if Excel_vorhanden then begin if fileexists(fname) then excelstart(self); if not fileexists(fname) or exneu then begin Excel_Layout1(self); qxyz :=TQuery(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);
Qx2Excel(qxyz);
excel.activeworkbook.saveas(fname); Excel_Layout2(self); end; excel.visible := true; end; end; |
D. Annies - Do 09.04.09 13:09
Danke, Nico,
das hatte ich gesehen, aber siehe oben.
Was nun?
BenBE - Do 09.04.09 13:37
Oops, übersehen. TQuery ist bereits die Datasource, nicht erst das DataSet ...
D. Annies - Do 09.04.09 14:23
Was muss ich denn nun tun? :? :?
Detlef
BenBE - Do 09.04.09 14:38
Meinen Post lesen, verstehen und umsetzen ;-)
Konkret bedeutet dies: Meinen anderen Post mit dem Quelltext lesen, die in ersterem referenziertem Post genannte Stelle suchen (gibt nicht so viele, die da zutreffen) und diese ändern (so wie in ersterem Post erwähnt.
Zu risiken und Nebenwirkungen empfehle ich :arrow:
Crashkurs Delphi [
http://www.christian-stelzmann.de/artikel/crashkurs.htm] von
Christian S.
D. Annies - Do 09.04.09 17:38
Hi Benny,
wäre schön, wenn du noch einmal etwas konkreter hilfst.
(Es ist nicht so, dass ich mich nicht bemühe, deinen Code zu verstehen)
Danke, Detlef
---
Moderiert von
Narses: Beiträge zusammengefasst---
Hi, Benny,
es ist definitiv die Codestelle, durch die Popupmenu6 ersetzt wird (werden soll) durch
Delphi-Quelltext
1:
| TPopupMenu(TMenuItem(sender).Owner |
Ist da etwas falsch?
Moderiert von
Narses: Delphi-Tags hinzugefügt
jaenicke - Fr 10.04.09 00:28
Ich markiere mal den entsprechenden Teil:
BenBE hat folgendes geschrieben : |
Delphi-Quelltext 1:
| TQuery(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset); | |
BenBE hat folgendes geschrieben : |
| Oops, übersehen. TQuery ist bereits die Datasource, nicht erst das DataSet ... |
Na was schlussfolgerst du daraus? ;-)
Richtig, weg damit.
D. Annies - Fr 10.04.09 08:19
Hi,
folgender Code geht = erste Zeile
geht nicht = zweite Zeile:
Delphi-Quelltext
1: 2:
| Qx2Excel(TQuery(TDBGrid(PopupMenu6.popupComponent).Datasource.DataSet)); Qx2Excel(TQuery(TDBGrid(TPopupMenu(TMenuItem(sender).Owner).popupComponent).Datasource)); |
!
jaenicke - Fr 10.04.09 08:22
Versuch mal Parent statt Owner, Owner muss ja nicht das Popupmenü sein.
Außerdem gehört dann das DataSet wohl doch dazu, wenn die erste Zeile geht. Ich selbst kenne die Komponente nicht weiter, ich hatte nur das Zitat oben gelesen.
D. Annies - Fr 10.04.09 08:49
Das geht leider auch nicht.
jaenicke - Fr 10.04.09 08:50
Hast du denn mal im Debugger geschaut was da wo drin steht, bei den ganzen Casts in der Zeile?
D. Annies - Fr 10.04.09 08:59
Nein, aber vielleicht ist dann ja die Logik, dass ich eine Proc mit dem Namen des PopupMenu's als Übergabeparameter haben muss. (?).
Aber ich warte denn mal auf eine [abschließende] Klarstellung --> von Benny ?
Grüße aus Lübeck :wink:
jaenicke - Fr 10.04.09 09:08
Einfach schnell im Debugger nachschauen was an der Stelle da drin steht, würde jedenfalls sicher sehr viel schneller gehen... :roll:
D. Annies - Fr 10.04.09 09:17
Ich weiß nicht, wie das geht.
jaenicke - Fr 10.04.09 09:19
Den Ausdruck markieren und Strg + F7 drücken. Zum Beispiel kannst du dann in dem Fenster auch diesen Ausdruck auswerten:
Delphi-Quelltext
1:
| TMenuItem(Sender).Owner.Name |
D. Annies - Fr 10.04.09 09:33
Bei deinem Ausdruck steht im Ergebnis nichts und bei meinem Ausdruck steht ebenfalls nichts;
(ich musste ihn aber noch (in der Anzeige) vervollständigen, weil er trotz Markieren
nicht ganz dargestellt wurde.)
jaenicke - Fr 10.04.09 09:36
Dann musst du schauen was in den verschiedenen Teilen drin steht:
Delphi-Quelltext
1: 2:
| Sender.Name TMenuItem(Sender).Parent.Name |
Und so weiter, du musst die Arbeit mit dem Debugger schon lernen, sonst kommst du nie weit, wenn ein Fehler auftritt. ;-)
D. Annies - Fr 10.04.09 09:42
In beiden Fällen: Undefinierter Bezeichner TMenuItem
P.S. Ich bin ja froh über Hilfe, ihr knackt das schon - fragt sich nur, wie.
D. Annies - Fr 10.04.09 09:52
So, nun hab ich es. (Inspektor Zufall)
Es muss heißen:
Delphi-Quelltext
1:
| Qx2Excel(TQuery(TDBGrid(TPopupMenu(TMenuItem(sender).GetParentComponent).popupComponent).Datasource.DataSet)); |
So, nun ist dieses Problem wohl (ohne Ironie) gelöst ...
Gruß, Detlef
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!