Autor Beitrag
delphi_neuling1
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 19.03.09 19:58 
Hallo zusammen,

auf meiner Form liegen 2 StringGrids, diese Grids sollen Dateien per Drap&Drop erhalten.
Das Problem das ich dabei im Moment habe ist herauszufinden auf welches der Grids die Datei
gedroppt worden ist.

Hier mal etwas Code dazu:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
uses ShellApi;

type
  TStringGrid = class(Grids.TStringGrid)
  private
    procedure WMDROPFILES(var Msg: TMessage); Message WM_DROPFILES;
end;


Vielleicht verfolge ich aktuell auch den falschen Ansatz um das Problem zu lösen:

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:
procedure TStringGrid.WMDROPFILES(var Msg: TMessage);
var
  Counts, Size: Integer;
  PCharFileName: PChar;
  MausPos: TPoint;
begin
  inherited;
  PCharFileName := nil;
  Counts := DragQueryFile(Msg.WParam, $FFFFFFFF, PCharFileName, 255);
    if Counts=1 then
      begin
        GetCursorPos(MausPos);  // Mausposition erhalten
        Size := DragQueryFile(Msg.WParam, 0nil0) + 1;
        PCharFileName := StrAlloc(Size);
        DragQueryFile(Msg.WParam, 0, PCharFileName, Size);
        ShowMessage(PCharFileName); // Wird später entfernt
          if ExtractFileExt(PCharFileName)='.xls' then   // Dateiendung extrahieren und prüfen
            begin
              if ((FindDragTarget(MausPos, FALSE) as TStringGrid).Name='Datei1Grid'then // Prüfen ob Drag&Drop auf Grid1
                begin
                  ShowMessage('grid1');
                  XLStoGrid (PCharFileName, XLSHauptForm.Datei1Grid); // Datei und Grid an Function übergeben
                  DragFinish(Msg.WParam);
                end;
              if ((FindDragTarget(MausPos, FALSE) as TStringGrid).Name='Datei2Grid'then  // Prüfen ob Drag&Drop auf Grid2
                begin
                  ShowMessage('grid2');
                  XLStoGrid (PCharFileName, XLSHauptForm.Datei2Grid); // Datei und Grid an Function übergeben
                  DragFinish(Msg.WParam);
                end;
            end else
              begin
                ShowMessage('Es können nur .XLS-Dateien verarbeitet werden'); // Meldung wenn FileExt nicht XLS ist
              end;
        end else
          begin
            ShowMessage('Bitte nur jeweils eine Datei ziehen und ablegen!'); // Meldung wenn mehr als eine Datei gedroppt worden ist
          end;
StrDispose(PCharFileName);
DragFinish(Msg.WParam);
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TXLSHauptForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Datei1Grid.Handle, True);
DragAcceptFiles(Datei2Grid.Handle, True);
end;


Das aktuelle Problem bei meinem Versuch ist, das ich zeitweise eine Fehlermeldung erhalte.
Diese scheint vorallem dann aufzutreten wenn die Function etwas länger beschäftigt ist (Große XLS-Datei).

Fehlermeldung ist die folgende:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EInvalidCast mit der Meldung 'Ungültige Typumwandlung' aufgetreten.
---------------------------
Anhalten   Fortsetzen   Hilfe   
---------------------------


Ich bin für jeden Vorschlag oder einen Denkansatz für mich dankbar.
Mir fehlt im Moment echt die Idee wie ich es anders lösen könnte, bzw. etwas eleganter.

Besten Dank vorab und viele Grüße,

Der Neuling

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
delphi_neuling1 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 24.03.09 19:53 
Hallo noch mal,

den obigen Code habe ich jetzt wie folgt angepasst:

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:
procedure TStringGrid.WMDROPFILES(var Msg: TMessage);
var
  Counts, Size: Integer;
  PCharFileName: PChar;
  MausPos: TPoint;
begin
  inherited;
  PCharFileName := nil;
  Counts := DragQueryFile(Msg.WParam, $FFFFFFFF, PCharFileName, 255);
    if Counts=1 then
      begin
        GetCursorPos(MausPos);  // Mausposition erhalten
        Size := DragQueryFile(Msg.WParam, 0nil0) + 1;
        PCharFileName := StrAlloc(Size);
        DragQueryFile(Msg.WParam, 0, PCharFileName, Size);
        ShowMessage(PCharFileName); // Wird später entfernt
          if ExtractFileExt(PCharFileName)='.xls' then   // Dateiendung extrahieren und prüfen
            begin
              if ((FindDragTarget(MausPos, FALSE)=XLSHauptForm.Datei1Grid)) then // Prüfen ob Drag&Drop auf Grid1
                begin
                  ShowMessage('grid1');
                  XLStoGrid (PCharFileName, XLSHauptForm.Datei1Grid); // Datei und Grid an Function übergeben
                end;
              if ((FindDragTarget(MausPos, FALSE)=XLSHauptForm.Datei2Grid)) then  // Prüfen ob Drag&Drop auf Grid2
                begin
                  ShowMessage('grid2');
                  XLStoGrid (PCharFileName, XLSHauptForm.Datei2Grid); // Datei und Grid an Function übergeben
                end;
            end else
              begin
                ShowMessage('Es können nur .XLS-Dateien verarbeitet werden'); // Meldung wenn FileExt nicht XLS ist
              end;
        end else
          begin
            ShowMessage('Bitte nur jeweils eine Datei ziehen und ablegen!'); // Meldung wenn mehr als eine Datei gedroppt worden ist
          end;
StrDispose(PCharFileName);
DragFinish(Msg.WParam);
end;

Eine Exception ist bis jetzt nicht mehr aufgetreten.
Aber gegen Vorschläge den Code zu ändern oder es elegenater zu lösen
habe ich noch immer keine Einwände ;)

Viele Grüße,

Der Neuling