Delphi-PRAXiS

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 Drag&Drop (https://www.delphipraxis.net/1731-drag-drop.html)

nailor 19. Dez 2002 21:42


Drag&Drop
 
Bei Den RichEdits ist Drag&Drop ja schon eingebaut. Bei Memos nicht. Gibt es da irgendwas zu machen, oder muss ich wohl oder übel ein RichEdit nehmen???

Luckie 19. Dez 2002 22:20

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMDROPFILE (var msg: TMessage ); Message WM_DropFiles ;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses shellapi;

{$R *.dfm}

procedure TForm1.WMDROPFILE(var msg: TMessage);
var
  hDrop : Cardinal ;
  fName : array[0..MAX_PATH] of Char ;
begin
   hDrop := Msg.WParam ;
   fName := '' ;
   DragQueryFile(hDrop, 0, fName, MAX_PATH);
   Memo1.Lines.LoadFromFile(String(fName));
   DragFinish (hDrop);
end;

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

nailor 20. Dez 2002 08:29

sorry, ich meinte: text aus dem memo markieren, mit der maus drüber und dann den text verschieben. nicht ne datei öffnen.

Luckie 20. Dez 2002 11:40

Mist 15 Minuten umsonst programmiert und im Internet zusammengesucht. Kannst du das nicht trotzdem irgendwie in dein Programm einbauen? :roll:

nailor 20. Dez 2002 12:06

Natürlich kann ich. Dann nehm ich das zum Öffnen von Dateien mit dazu. Und außerdem nehm ich jetzt doch RichEdits. Ist mir zu dumm, das mit Memos zu machen.

Eine Frage noch: Kann man irgendwie was machen in die Richtung, dass wenn man wenn man einen String auf einem Label droppt, er dann zu einem Richedit dazugefügt wird???;

Danke schonmal, für das mit Datei öffnen, und viel Spass beim meine-Fragen-beantworten! :wink: :wink: :wink:

nailor 20. Dez 2002 17:20

irgendwas in die richtung:

Delphi-Quellcode:
procedure Label1OnDrop(???);
begin
if (??? is Stirng) then
  memo.lines.append(???);
end;

Luckie 20. Dez 2002 17:23

Was soll den Auf das Label gezogen werden? Ich habe das jetzt so verstanden, dass das, was du auf das Label ziehst im Memo erscheinen soll. Aber was wird von wo auf das Label gezogen?

nailor 20. Dez 2002 17:32

Ich hab den Code jetzt getestet. Der klappt nicht richtig. Man kann zwar Dateien droppen, aber die werden dann nicht geöffnet.

Ausserdem nimmt mein Delphi
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMDROPFILE (var msg: TMessage ); Message WM_DropFiles ; [color=#ff0000]Das hier nicht an[/color]
  public
    { Public-Deklarationen }
  end;

Luckie 20. Dez 2002 17:32

Du brauchst: Label1 (Ziel), Label2 (Quelle) und ein Memo. Wenn du jetzt von Label2 nach Label1 ziehst, erscheint der Text von Label2 in Label1 und wird ins Memo eingefügt:
Delphi-Quellcode:
procedure TForm1.Label2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then Label2.BeginDrag(false);
end;

procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source is TLabel then Accept := true;
end;

procedure TForm1.Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source is TLabel then
  begin
    Label1.Caption := Label2.Caption;
    Memo1.Lines.Add(Label2.Caption);
  end;
end;

Luckie 20. Dez 2002 17:35

Zitat:

Zitat von Nailor
Ich hab den Code jetzt getestet. Der klappt nicht richtig. Man kann zwar Dateien droppen, aber die werden dann nicht geöffnet.

Also jetzt doch wieder Dateien oder wie oder was oder wo? :roll:

nailor 20. Dez 2002 21:48

chronologisch:

-ich will drag und drop, drück mich falsch aus
-du gibts mir mit file open
-ich frag noch mal nach
-du bist enttäuscht
-ich sag, dass ich beides einbau
-du gibst mir das mit text statt file auch noch

jetzt kommt:
-ich teste, ob das mit dem text klappt
-ich suche den fehler in dem mit der datei

Christian Seehase 21. Dez 2002 00:55

Moin Nailor,

Du musst statt WM_DROPFILES WMDROPFILES nehmen, dann sollte es gehen.

Luckie 21. Dez 2002 02:16

Nein, er hat es schin richtig gemacht, er muß nur auch das ganze implementieren, sonst klappt es nicht.

Ich weiß immer noch nicht, was du willst. :(
Zitat:

Was soll den Auf das Label gezogen werden? Ich habe das jetzt so verstanden, dass das, was du auf das Label ziehst im Memo erscheinen soll. Aber was wird von wo auf das Label gezogen?

nailor 21. Dez 2002 11:36

also ich will genau folgendes:

ein pagecontrol, ind dem jede geöffnete textdatei ein tabsheet bekommt. markiert man jetzt in einer textdatei (in einem Richedit) den text, kann man ihn ja verschieben. nun soll man ihn aber auf ein anderes Tabsheet "droppen" können, und dann soll er beim jeweiligen RichEdit hinten angehängt werden. Wenn das mit den TabSheets nicht geht, kann man alternativ auch Labels oder Panels oder so was nehmen. Nur halt nicht das andere RichEdit direkt, weil das bei 10 Dateien nicht mehr alles so gut auf einen desktop passt!

nailor 18. Feb 2003 20:39

Noch ein Versuch:

Ich will, dass folgendes geht:

1. Ich starte mein Programm aus einm Arbeitsplatz-Ordner
2. Ich geh mit der Maus aus meinem Programm, in den Ordner, klick die Project1.dpr an und halte gedrückt
3. Ich zieh die Maus wieder in mein Programm, und lass los
4. Irgendwo steht nun ein String mit dem Pfad+Namen der Datei (also in nem Edit, als Caption, als string in einer Variable...)

Jan 18. Feb 2003 21:28

Hallöchen,
ich wollte nur mal schnell dem Luckie meinen Dank aussprechen, der drag & drop code ist echt klasse, also deine Arbeit war mit Sicherheit umsonst, aber nicht vergebens. :spin:
Gruß
Jan

eddy 19. Feb 2003 10:28

Hallo Nailor,

ich habe diese Beiträge gelesen und weiß immer noch nicht genau, was Du eigentlich willst. Es gibt zwar ein Haufen Interpretationen, aber eindeutig ist's wohl nicht.

Du öffnest Dein Programm und es wird ein Memo oder RichEdit angezeigt. Das ist erstmal leer. Jetzt minimierst Du Deine Anwendung, damit als Icon irgendwo abgelegte Text(??)-Dateien sichtbar werden, z.B. Project1.dpr Du siehst das Symbol auf Dein Memo und beim Loslassen soll Dein Programm die entsprechende Datei prüfen, ob es sich um eine Datei mit lesbaren Text handelt (keine EXE, DLL, GIF, PPS, ...) und, sollte es ein Text sein, öffnen, den gesamten Inhalt makieren und diesen dann in den Zwischenspeicher kopieren. Diese Kopie soll anschließend an der Stelle, an dem sich der Cursor in Deinem Memo befindet eingefügt werden.

Dann wiederholst Du das Ganze mit dem nächsten Text z.B Projekt.pas

Anschließend kannst Du Dein Memo bearbeiten, sicherlich speichern (??)

Habe ich das so richtig verstanden?


mfg
eddy

eddy 20. Feb 2003 23:27

Hallo Nailor,

vielleicht hilft Dir das weiter:

Code:
procedure TFTest.WMDROPFILE(var msg: TMessage);
var
  hDrop : Cardinal ;
  fName : array[0..MAX_PATH] of Char ;
  fnnew, fnold : string;
  i : integer;
begin
   hDrop := Msg.WParam ;
   fName := '' ;

   i := 0;
   fnold := '';
   DragQueryFile(hDrop, i, fName, MAX_PATH);
   fnnew := string(fName);
   while fnnew <> fnold do begin
     fnold := fnnew;
     Memo2.Lines.LoadFromFile(String(fName));
     Memo2.SelectAll;
     Memo2.CopyToClipboard;
     Memo1.SelStart := Memo1.GetTextLen;
     Memo1.Lines.Add('');
     Memo1.Lines.Add('');
     Memo1.Lines.Add('');
     Memo1.Lines.Add(fnnew);
     Memo1.Lines.Add('');
     Memo1.PasteFromClipboard;

//     RichEdit1.Lines.LoadFromFile(String(fName));
     inc(i);
     DragQueryFile(hDrop, i, fName, MAX_PATH);
     fnnew := string(fName);
   end;
   DragFinish (hDrop);
end;


procedure TFTest.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle,True);
end;
Im Explorer angeklickte Dateien (eine oder mehrere) werden ins Memo der eigenen Anwendung gezogen. Nach loslassen der Maustaste werden diese im Memo eingetragen.

Das Löschen des Memo's sowie die Auswertung, ob die ins Memo gezogene Datei auch lesbarer Text ist, sind hier noch nicht enthalten.

Die Variante, aus TabSheet's Text ins Memo zu transferieren ist noch einfacher:
- Text markieren
- Text in den Zwischenspeicher
- Text in Memo aus Zwischenspreicher

mfg
eddy

nailor 21. Feb 2003 15:20

soweit alles schön und gut! Aber es läuft nicht! Was muss ich einbinden für: DragQueryFile, DragFinish, DragAcceptFiles? Mit dem Code den ich habe sind das Undefined Identifiers. :cry:

eddy 21. Feb 2003 20:09

Hallo Nailor,

Code:
uses
  shellapi;
steht im ersten Beitrag von Luckie zu diesem Thema!

mfg
eddy

Christian Seehase 22. Feb 2003 01:30

Moin Nailor,

[EDIT]
ich hatte die zweite Seite des Threads übersehen :oops:
[/EDIT]

nailor 23. Feb 2003 20:06

Klappt!!! :firejump: :firejump:

KAnn man jetzt noch irgendwie die AVs verhindern, wenn man einen Ordner droppt?

eddy 24. Feb 2003 09:03

Hallo Nailor,

entweder Du prüfst, ob die Datei existiert oder mit try - except

Ich habe das 2. verwendet:

Code:
procedure TFTest.WMDROPFILE(var msg: TMessage);
var
  hDrop : Cardinal ;
  fName : array[0..MAX_PATH] of Char ;
  fnnew, fnold : string;
  i : integer;
begin
   hDrop := Msg.WParam ;
   fName := '' ;

   i := 0;
   fnold := '';
   DragQueryFile(hDrop, i, fName, MAX_PATH);
   fnnew := string(fName);
   while fnnew <> fnold do begin
     fnold := fnnew;
     try
       Memo2.Lines.LoadFromFile(String(fName));
       Memo2.SelectAll;
       Memo2.CopyToClipboard;
       Memo1.SelStart := Memo1.GetTextLen;
       Memo1.Lines.Add('');
       Memo1.Lines.Add('');
       Memo1.Lines.Add('');
       Memo1.Lines.Add(fnnew);
       Memo1.Lines.Add('');
       Memo1.PasteFromClipboard;
     except
       MessageDlg(fnnew + ' konnte nicht geöffnet werden', mtError, [mbOK], 0);
     end;
//     RichEdit1.Lines.LoadFromFile(String(fName));
     inc(i);
     DragQueryFile(hDrop, i, fName, MAX_PATH);
     fnnew := string(fName);
   end;
   DragFinish (hDrop);
end;
mfg
eddy

PS: was heißt "AVs" auf Deutsch?

nailor 24. Feb 2003 10:49

Zugriffsverletzung glaub ich, falls sich das so schreibt

nailor 25. Feb 2003 21:00

Sorry, dass ich deinen Code so verstümmelt habe, aber warum geht das nicht?

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ShellApi;

procedure WMDROPFILE(var msg: TMessage);

procedure TForm1.WMDROPFILE(var msg: TMessage);
var
  hDrop: cardinal;
  fName: array[0..MAX_PATH] of char;
begin
hDrop := Msg.WParam;
fName := '' ;
DragQueryFile(hDrop, 0, fName, MAX_PATH);
ShowMessage('*' + string(fName) + '*');
//LabeledEdit1.Text := string(fName);
DragFinish (hDrop);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle,True);
end;
Es kommt noch nichtmal eine MessageBox mit zwei Sternchen, aber der Drag&Drop-Zeiger kommt :?

eddy 26. Feb 2003 00:57

Hallo Nailor,

es gibt da einen kleinen Unterschied zwischen Deinem Code und dem von Luckie übernommenen Code:

Delphi-Quellcode:
private
  { Private-Deklarationen } 
   procedure WMDROPFILE (var msg: TMessage ); Message WM_DropFiles ;
// procedure WMDROPFILE(var msg: TMessage);
Der kleine Unterschied macht's!

mfg
eddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 Uhr.

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