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);                          //popup6
begin
  fname := concat(label30.caption, 'OUTXLS\Liste der Lehrkräfte.xls');
  if Excel_vorhanden then
  begin
    if fileexists(fname) then  excelstart(self);    //löschen/überschreiben?
    if not fileexists(fname) or exneu then
    begin
      Excel_Layout1(self);
      Qx2Excel(QLk);                 //Excel(0/0) = [1,0]; Zeile/Spalte!
      excel.activeworkbook.saveas(fname);
      Excel_Layout2(self);
    end;
    excel.visible := true;
  end;
end;

procedure TForm1.Excel4Click(Sender: TObject);                          //popup5
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

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: 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);                          //popup6
//var qxyz : TQuery;
begin                                              // TbLk.tablename
  fname := concat(label30.caption, 'OUTXLS\' + extractfilename(changefileext(TbLk.TableName, '.xls')));
  //showmessage(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset.Name);

  if Excel_vorhanden then
  begin
    if fileexists(fname) then  excelstart(self);    //löschen/überschreiben?
    if not fileexists(fname) or exneu then
    begin                            //Excel(0/0) = Delphi[1,0]; Zeile/Spalte auch vertauscht!
      Excel_Layout1(self);
      //qxyz := TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset;

      Qx2Excel(QLk);             // GetParentMenu <--- GetParentComponent = Sender ?

      //Qx2Excel(TDBGrid(PopupMenu6.popupComponent).Datasource.DataSet);
  //  Qx2Excel(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);
      //Qx2Excel((((sender as TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent) as TDBGrid.Datasource.Dataset);
      //Dx2Excel(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);
      excel.activeworkbook.saveas(fname);
      Excel_Layout2(self);
    end;
    excel.visible := true;
  end;
end;

procedure TForm1.Excel4Click(Sender: TObject);                          //popup5
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;                     // z.B. 3 -> C  (65=48+17)
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);                          //popup6
var 
  qxyz : TQuery;

begin                                              // TbLk.tablename
  fname := concat(label30.caption, 'OUTXLS\' + extractfilename(changefileext(TbLk.TableName, '.xls')));
  //showmessage(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset.Name);

  if Excel_vorhanden then
  begin
    if fileexists(fname) then  excelstart(self);    //löschen/überschreiben?
    if not fileexists(fname) or exneu then
    begin                            //Excel(0/0) = Delphi[1,0]; Zeile/Spalte auch vertauscht!
      Excel_Layout1(self);
      qxyz := TQuery(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);

      Qx2Excel(QLk);             // GetParentMenu <--- GetParentComponent = Sender ?

      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 user profile iconNarses: 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);                          //popup6
var 
  qxyz : TQuery;
begin                                              // TbLk.tablename
  fname := concat(label30.caption, 'OUTXLS\' + extractfilename(changefileext(TbLk.TableName, '.xls')));
  //showmessage(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset.Name);

  if Excel_vorhanden then
  begin
    if fileexists(fname) then  excelstart(self);    //löschen/überschreiben?
    if not fileexists(fname) or exneu then
    begin                            //Excel(0/0) = Delphi[1,0]; Zeile/Spalte auch vertauscht!
      Excel_Layout1(self);
      qxyz :=TQuery(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);

      //Qx2Excel(QLk);             // GetParentMenu <--- GetParentComponent = Sender ?
      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 user profile iconChristian 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 user profile iconNarses: 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 user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Fr 10.04.09 00:28

Ich markiere mal den entsprechenden Teil:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
TQuery(TDBGrid(TPopupMenu(TMenuItem(Sender).Owner).popupComponent).Datasource.Dataset);                    
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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));  // geht
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 // sollte der Name des Menüitems sein
TMenuItem(Sender).Parent.Name // könnte das Popupmenü sein
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