Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Meine Drag'n'Drop-Funktion ergänzen (https://www.delphipraxis.net/149884-meine-dragndrop-funktion-ergaenzen.html)

AlexII 1. Apr 2010 16:17


Meine Drag'n'Drop-Funktion ergänzen
 
Hi,

ich habe wie folgt in mein Prog ne Drag'n'Drop Funktion eingebaut:

Delphi-Quellcode:
implementation

uses ShellAPI;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Form1.Handle, true);
end;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMDROPFILES(var Msg: TMessage); message WM_DROPFILES;
  private
...

procedure TForm1.WMDROPFILES(var Msg: TMessage);
begin
showmessage('Ja es hat geklappt, hier lade ich die Daten');
end;
Jetzt mein Problem: damit ich die Daten, der auf das Prog zu ziehender Datei, laden kann, muss ich den Datentyp der Datei wissen. Wie kriege ich das raus, wer kann mir das sagen? :gruebel:

DeddyH 1. Apr 2010 16:32

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Genügt es nicht, nach der Endung zu schauen?

AlexII 1. Apr 2010 16:34

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Zitat:

Zitat von DeddyH
Genügt es nicht, nach der Endung zu schauen?

Ja klar, ist sogar besser :-D aber wie? :gruebel:

mirage228 1. Apr 2010 16:35

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Delphi-Referenz durchsuchenWM_DROPFILES, Delphi-Referenz durchsuchenExtractFileExt

Über die Suche solltest Du alles Relevante finden ;)

AlexII 1. Apr 2010 16:39

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Ja das habe ich gefunden ->
Delphi-Quellcode:
function ExtractFileExt(const FileName: string): string; overload;
Aber wie finde ich den FileName raus?

DeddyH 1. Apr 2010 16:42

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Delphi-Quellcode:
procedure TForm1.WMDROPFILES(var Msg: TMessage);
var i, count: Cardinal;
    Buffer, Extension: string;
begin
  inherited;
  Buffer := '';
  count := DragQueryFile(Msg.WParam,$FFFFFFFF,nil,0);
  for i := 0 to count - 1 do
    begin
      SetLength(Buffer,DragQueryFile(Msg.WParam,i,nil,0) + 1);
      DragQueryFile(Msg.WParam,i,@Buffer[1],Length(Buffer));
      Extension := ExtractFileExt(Buffer);
      ShowMessage(Extension);
    end;
end;

AlexII 1. Apr 2010 16:45

Re: Meine Drag'n'Drop-Funktion ergänzen
 
:shock: so kompliziert? :shock:

OK thx :thumb:

DeddyH 1. Apr 2010 16:48

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Du kannst Dir natürlich auch entsprechende Komponenten installieren, siehe hier.

AlexII 1. Apr 2010 16:51

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Will ich vermeiden, weiß sowieso nicht wie man sie richtig einsetzen muss.

AlexII 1. Apr 2010 17:54

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Hab jetzt ein Problem, welches ich nicht lösen kann.
Und zwar ich lade die Daten per Import und will auch per Drag'n'Drop, siehe Code.

Bei der Lösung per Drag'n'Drop bekomme ich als die Fehlermeldung
Zitat:

Listenindex überschreitet das Maximum(1)
Was kann das den sein? Beim Importieren bekomm ich die aber nicht.

Delphi-Quellcode:
//Import
procedure TForm1.ChannelListImport1Click(Sender: TObject);
var i: Integer;
    List : TStringList;
    List2: TStringList;
begin
if OpenDialog1.Execute then
begin
  List:=TStringList.Create;
  try
    List.LoadFromFile(OpenDialog1.FileName);

    if ListBox1.Count<>0 then
    begin
    if MessageDlg(_('Retain existing radio stations list?'), mtInformation, [mbYes, mbNo], 0) = mrNo then
    begin
    ListBox1.Clear;
    ListBox2.Clear;
    ListBox3.Clear;
    ListBox4.Clear;
    end;
    end;

    if ExtractFileExt(OpenDialog1.Filename)='.crp' then
    begin
    for i:=0 to List.Count-1 do
    begin
    List2:=Explode('<>', List[i]);
    ListBox1.Items.Insert(i, List2[1]);
    ListBox2.Items.Insert(i, List2[2]);
    ListBox3.Items.Insert(i, List2[3]);
    ListBox4.Items.Insert(i, List2[4]);
    List2.Free;
    end;
    end else
        begin
        for i:=0 to List.Count-1 do
        begin
        List2:=Explode('=', List[i]);
        ListBox1.Items.Insert(i, List2[1]);
        ListBox2.Items.Insert(i, List2[2]);
        ListBox3.Items.Insert(i, List2[3]);
        ListBox4.Items.Insert(i, List2[4]);
        List2.Free;
        end;
        end;

  finally
    List.Free;
  end;
end;
end;
Delphi-Quellcode:
//Und hier per Drag'n'Drop
procedure TForm1.WMDROPFILES(var Msg: TMessage);
var j, count: Cardinal;
    Buffer: String;
    i: Integer;
    List : TStringList;
    List2: TStringList;
begin
  inherited;
  Buffer := '';
  count := DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 0);
  for j := 0 to count - 1 do
    begin
      SetLength(Buffer, DragQueryFile(Msg.WParam, j, nil, 0) + 1);
      DragQueryFile(Msg.WParam, j, @Buffer[1], Length(Buffer));
    end;

//Laden
List:=TStringList.Create;
  try
    List.LoadFromFile(Buffer);

    if ListBox1.Count<>0 then
    begin
    if MessageDlg(_('Retain existing radio stations list?'), mtInformation, [mbYes, mbNo], 0) = mrNo then
    begin
    ListBox1.Clear;
    ListBox2.Clear;
    ListBox3.Clear;
    ListBox4.Clear;
    end;
    end;

    if ExtractFileExt(Buffer)='.crp' then
    begin
    showmessage(inttostr(ListBox1.Count));
    for i:=0 to List.Count-1 do
    begin
    showmessage(inttostr(ListBox1.Count));
    List2:=Explode('<>', List[i]);
    ListBox1.Items.Insert(i, List2[1]);
    ListBox2.Items.Insert(i, List2[2]);
    ListBox3.Items.Insert(i, List2[3]);
    ListBox4.Items.Insert(i, List2[4]);
    List2.Free;
    end;
    end else
        begin
        for i:=0 to List.Count-1 do
        begin
        List2:=Explode('=', List[i]);
        ListBox1.Items.Insert(i, List2[1]);
        ListBox2.Items.Insert(i, List2[2]);
        ListBox3.Items.Insert(i, List2[3]);
        ListBox4.Items.Insert(i, List2[4]);
        List2.Free;
        end;
        end;

  finally
    List.Free;
  end;
end;

daywalker9 1. Apr 2010 18:10

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Schon mal gedebuggt?

AlexII 1. Apr 2010 18:14

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Zitat:

Zitat von daywalker9
Schon mal gedebuggt?

Ne, hab mal versucht, aber blicke da nicht durch, keine Ahnung wie es geht.

DeddyH 1. Apr 2010 19:21

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Setz einen Haltepunkt und steppe mit F8 durch, bis es knallt. Dann hast Du zumindest schonmal die fehlerverursachende Zeile.

AlexII 1. Apr 2010 20:25

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Also das Problem liegt irgendwo hier:

Delphi-Quellcode:
    showmessage(ExtractFileExt(Buffer));
    if ExtractFileExt(Buffer)='.crp' then
    begin
    showmessage('ja');
    showmessage(ExtractFileExt(Buffer));
    end else
        begin
        showmessage('nein');
        showmessage(ExtractFileExt(Buffer));
        end;
Ich lade eine .crp Datei bekomme aber "nein" Meldung, wieso das denn? :wall:

daywalker9 1. Apr 2010 20:28

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Was kommt den bei
Delphi-Quellcode:

showmessage(ExtractFileExt(Buffer));
raus?

AlexII 1. Apr 2010 20:32

Re: Meine Drag'n'Drop-Funktion ergänzen
 
.crp also das was ich brauche... :roteyes:

DeddyH 1. Apr 2010 20:34

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Steht da evtl. noch ein Leerzeichen dahinter oder so? BTW: Du untersuchst immer nur die letzte Datei aus der "Drop-Liste", das ist Dir hoffentlich bewusst.

AlexII 1. Apr 2010 20:37

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Zitat:

Zitat von DeddyH
Steht da evtl. noch ein Leerzeichen dahinter oder so? BTW: Du untersuchst immer nur die letzte Datei aus der "Drop-Liste", das ist Dir hoffentlich bewusst.

Ne da gibt's keine Leerzeichen...

Zitat:

BTW: Du untersuchst immer nur die letzte Datei aus der "Drop-Liste", das ist Dir hoffentlich bewusst.
Was meinst du damit?

DeddyH 1. Apr 2010 20:37

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Ich meine damit, dass man ja durchaus mehrere Dateien in einem Rutsch Drag&Droppen kann.

AlexII 1. Apr 2010 20:39

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Zitat:

Zitat von DeddyH
Ich meine damit, dass man ja durchaus mehrere Dateien in einem Rutsch Drag&Droppen kann.

Kann man das irgendwie verbieten?

DeddyH 1. Apr 2010 20:43

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Nicht, dass ich wüsste. Aber Du könntest innerhalb der Schleife alle Dateien abarbeiten und nach der ersten stimmigen Endung aufhören.

AlexII 1. Apr 2010 20:48

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Ok, aber ich verstehe nicht, wieso bekomme ich hier ne "nein" Meldung? :wall:

Delphi-Quellcode:
    showmessage(Extension);

    if Extension='.crp' then
    begin
    showmessage('ja');
    end else
        begin
        showmessage('nein');
        end;

DeddyH 1. Apr 2010 20:49

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Wie sieht es so aus?
Delphi-Quellcode:
if AnsiSameText(trim(Extension), '.crp') then

AlexII 1. Apr 2010 20:54

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Wow ja es geht :dancer2:

Wo liegt denn der Unterschied? :gruebel:

DeddyH 1. Apr 2010 20:56

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Ich schneide evtl. Steuerzeichen vorn und hinten ab und unterscheide nicht zwischen Groß- und Kleinschreibung (ich denke mal, letzteres war auch das Problem).

AlexII 1. Apr 2010 20:58

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Aber komischerweise funktioniert die Abfrage, also
Zitat:

if ExtractFileExt(Buffer)='.crp' then
im Code wo ich per OpenDialog importiere. :roteyes:

DeddyH 1. Apr 2010 21:00

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Darauf würde ich mich trotzdem nicht verlassen. Nimm AnsiSameText und Du bist auf der sicheren Seite (siehe oben).

AlexII 1. Apr 2010 21:04

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Ok hab das so gemacht... so aber das Problem im Post #10 besteht immer noch. :roteyes:

daywalker9 1. Apr 2010 21:10

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Du kommst nun ja in dein '.crp' rein. NUn setzte mal wie DeddyH schon gesagt hat einen Haltepunkt und Steppe mit F8 durch

AlexII 1. Apr 2010 21:13

Re: Meine Drag'n'Drop-Funktion ergänzen
 
So ich hab's....

Also im Post #10 hatte ich das Problem weil die Abfrage falsch war und die Datei falsch geladen wurde, deswegen der Fehler, mit
Zitat:

if AnsiSameText(trim(Extension), '.crp') then
klappt jetzt alles, wird alles richtig geladen. Im Post #28 war ein Denkfehler, also es läuft alles. :bouncing4:

Helmi 1. Apr 2010 21:18

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Du solltest aber trotzdem mal deine Freigabe der List2 überdenken.
Delphi-Quellcode:
        List2:=Explode('=', List[i]);
        ListBox1.Items.Insert(i, List2[1]);
        ListBox2.Items.Insert(i, List2[2]);
        ListBox3.Items.Insert(i, List2[3]);
        ListBox4.Items.Insert(i, List2[4]);
        List2.Free;
//<--

DeddyH 1. Apr 2010 21:19

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Trotzdem finde ich solchen Code etwas optimistisch:
Zitat:

Delphi-Quellcode:
List2:=Explode('<>', List[i]);
    ListBox1.Items.Insert(i, List2[1]);
    ListBox2.Items.Insert(i, List2[2]);
    ListBox3.Items.Insert(i, List2[3]);
    ListBox4.Items.Insert(i, List2[4]);
    List2.Free;

Du solltest nach dem Explode zumindest überprüfen, ob überhaupt mehr als 4 Elemente in der Liste stehen, das war vermutlich auch der Grund für den Fehler.

[edit] :lol: :cheers: [/edit]

AlexII 1. Apr 2010 21:19

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Hm... was genau? Verzeih, bin Hobbyprogrammierer. :gruebel:

AlexII 1. Apr 2010 21:21

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Ne der Fehler war deswegen, eine .crp Datei wird mit
Zitat:

List2:=Explode('<>', List[i]);
geladen und andere
Zitat:

List2:=Explode('=', List[i]);
und weil die Abfrage falsch war wurde die .crp mit "=" geladen, und das verursachte den Fehler.

DeddyH 1. Apr 2010 21:22

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Delphi-Quellcode:
List2:=Explode('<>', List[i]);
try
  if List2.Count > 1 then
    ListBox1.Items.Insert(i, List2[1]);
  if List2.Count > 2 then
    ListBox2.Items.Insert(i, List2[2]);
  if List2.Count > 3 then
    ListBox3.Items.Insert(i, List2[3]);
  if List2.Count > 4 then
    ListBox4.Items.Insert(i, List2[4]);
finally
  List2.Free;
end;
Oder wenn alles erfüllt sein muss:
Delphi-Quellcode:
List2:=Explode('<>', List[i]);
try
  if List2.Count > 4 then
    begin
      ListBox1.Items.Insert(i, List2[1]);
      ListBox2.Items.Insert(i, List2[2]);
      ListBox3.Items.Insert(i, List2[3]);
      ListBox4.Items.Insert(i, List2[4]);
    end;
finally
  List2.Free;
end;

AlexII 1. Apr 2010 21:26

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Und wieso soll ich überprüfen, ob mehr als 4 Elemente vorhanden sind? :gruebel:

DeddyH 1. Apr 2010 21:29

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Weil Du anschließend auf das 5. Element zugreifst. Und wenn das nicht da ist, gibt es den von Dir beschriebenen Fehler.

AlexII 1. Apr 2010 21:40

Re: Meine Drag'n'Drop-Funktion ergänzen
 
Zitat:

Zitat von DeddyH
Weil Du anschließend auf das 5. Element zugreifst. Und wenn das nicht da ist, gibt es den von Dir beschriebenen Fehler.

Ne es läuft alles. Irgendwie kopiere ich trotzdem das nicht... :roteyes:

DeddyH 1. Apr 2010 21:49

Re: Meine Drag'n'Drop-Funktion ergänzen
 
*Gnarf* Probier das Folgende mal aus, dann weißt Du, was ich meine:
Delphi-Quellcode:
Liste := TStringlist.Create;
try
  Liste.Add('Hallo');
  ShowMessage(Liste[1]); //es ist nur ein Element mit Index 0 (!!) vorhanden
finally
  Liste.Free;
end;

AlexII 1. Apr 2010 21:55

Re: Meine Drag'n'Drop-Funktion ergänzen
 
:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz