Avatar billede kroning Nybegynder
03. november 2009 - 19:52 Der er 18 kommentarer og
1 løsning

Drop tekst i TMemo

Nogle der har noget færdig kode der viser hvordan man kan droppe tekst i en TMemo fra f.eks. Explore browseren.
04. november 2009 - 11:14 #1
Hej,

Har jeg forstået dig ret når:

1: Du har en Webbrowser (eks. Twebbrowser).
2: Fra denne Browser ønsker du at hente data, som du (eller en anden) har tastet ind. ?

KRIS
Avatar billede kroning Nybegynder
04. november 2009 - 12:03 #2
Nej, det jeg vil er at kunne markerer tekst i f.eks. Internet Explore eller Firefox og trække denne tekst over og droppe den i min TMemo, TRichEdit understøtter dette uden videre men jeg vil altså bruge en TMemo.
04. november 2009 - 12:37 #3
HEJ,

OK,

Det kan jeg desværre ikke hjælpe dig med.

Men jeg arbejder selv med at hene POSTdata fra en TWebbrwsr
(du ved  HTML <FORM ..> <input text .. > <input SUBMIT  .. > osv...), så jeg så en mulighed der, men som sagt ....

Held og lykke med din videre søgning.

KRIS
Avatar billede mbsnet Nybegynder
06. november 2009 - 21:40 #4
Hej kroning, men du ønsker kun plain text ikke ? eller ønsker du også at formatere/highlighte teksten? hvis ikke har jeg et almindeligt drop eksempel liggende et sted....

//mortenbs
Avatar billede kroning Nybegynder
06. november 2009 - 21:50 #5
Ja det er en TMemo så det er kun plain text.
Avatar billede mbsnet Nybegynder
06. november 2009 - 22:37 #6
Nå, Mit eksempel var kun til filer..
Indsætter eksemplet nederst, men forsøg at kigge på link i stedet, for at droppe tekst: http://www.delphi3000.com/articles/article_1451.asp?SK=

Ellers sig til, så laver jeg et objekt til tekst drop...

Eksemplet til drop af filer:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
  procedure acceptFiles(var msg:tMessage);message WM_DROPFILES;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
shellApi;

procedure TForm1.acceptFiles(var msg:tMessage);
var i,aCount:integer;
    aItem:array [0..255] of char;
    aExt,aFilter:string;
begin
memo1.clear;
aCount:=dragQueryFile(msg.wParam,$FFFFFFFF,aItem,255);
for i:=0 to aCount-1 do begin
  dragQueryFile(msg.wParam,i,aItem,255);
  memo1.lines.add(aItem)
end;
dragFinish(msg.wParam)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
dragAcceptFiles(handle,true);
end;

end.
Avatar billede kroning Nybegynder
06. november 2009 - 23:38 #7
Eksemplet fra linket virker fint når det er fra TMemo til TMemo men forsøger jeg at droppe text andre steder fra så får jeg en cdNo cursor, og jeg har tilpasset OnDragOver.
Avatar billede mbsnet Nybegynder
08. november 2009 - 04:18 #8
Hej, har nu lavet nogle tests, og har svært ved at få den til at acceptere andet end filer, når det kommer udefra. Hvis det er data som kommer fra samme form, skal der laves forskellig håndtering, alt efter hvilken type source, dataen kommer fra.

Kan se at richedit fint accepterer drop fra eksempelvis Word eller Internet Explorer, men memo vil ikke. Hvis jeg vil have det over i memo, skal jeg først droppe teksten i richedit og derefter drag fra richedit til memo'en. :-(

Har fundet et andet link omkring emnet, men har ikke testet:
http://melander.dk/delphi/dragdrop/

Fra andre elementer på formen, er det baseret på source type
procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
var i:integer;aMemo:tMemo;
begin aMemo:=tMemo(sender);
if source is tMemo then aMemo.text:=aMemo.text+tMemo(source).selText+vbcrlf else
if source is tRichEdit then aMemo.text:=aMemo.text+tRichEdit(source).selText+vbcrlf else
if source is tListBox then with tListBox(source) do
  for i:=0 to items.count-1 do if selected[i] then aMemo.text:=aMemo.text+items[i]+vbcrlf else

aMemo.text:='Unsupported sender: '+sender.className
end;


...så desværre fortsat ingen løsning
Avatar billede kroning Nybegynder
08. november 2009 - 09:32 #9
En RichEdit vil også kunne bruges hvis man kunne få den til at opføre sig som en memo og kun vise plain text.
Avatar billede mbsnet Nybegynder
09. november 2009 - 09:12 #10
Hvis du kan få det at vide, når der droppes, kan du konvertere richedit data til tekst vha.:
with richEdit1.lines do text:=text;
Avatar billede mbsnet Nybegynder
09. november 2009 - 09:21 #11
Det er også helt klart anbefalet at bruge richedit i stedet for memo, - har læst memo har en begrænsning (~32k) i størrelse.

Det ultimative ville være at man kunne droppe teksten på et panel, og så behandle dataen som en string...
Avatar billede kroning Nybegynder
09. november 2009 - 18:37 #12
mbsnet> with richEdit1.lines do text:=text; virker fint bortset fra at skrift type og størrelse beholdes. Spørgsmålet er så også hvordan man registrer hvornår der droppes og brugeren kan jo også indsætte tekst ved at bruge tastaturet f.eks. CTRL+V.
Avatar billede mbsnet Nybegynder
09. november 2009 - 21:27 #13
OnChange event kan bruges, hvis den altid skal være plain text.
procedure TForm1.RichEdit1Change(Sender: TObject);
begin
with richEdit1 do if lines.text<>text then lines.text:=trim(text)
end;


Så opnås dog stadig ikke mulighed for OnDrop /lign., men det burde være muligt at formatere dataen i richEdit.

Ville meget hellere finde en løsning på at kunne få et TCustomPanel til at acceptere drop af tekst!?
Så ville det være muligt at droppe teksten ned i sine egne komponenter.
Avatar billede kroning Nybegynder
09. november 2009 - 22:46 #14
Glemte at nævne at hvis man benytter with richEdit1.lines do text:=text; i OnChange så flimre hele texten hver gang der sker en ændring hvilket jo ikke er brugbart.
Jeg er ikke helt klar over hvad du mener med at droppe på et panel men brugerne skal kunne droppe direkte i Memoen ellers er det ikke brugbart.
Avatar billede mbsnet Nybegynder
10. november 2009 - 01:42 #15
Problemet med OnChange kan løses med noget lign:
function forcePlainText(aRichEdit:tRichEdit):string;
var aStrm:tStringStream;s:string;aTag:integer;
begin if aRichEdit.tag=99 then exit;
aStrm:=tStringStream.create('');
with aRichEdit do begin plainText:=true;aTag:=tag;tag:=99;
  lines.saveToStream(aStrm);clear;
  result:=aStrm.dataString;lines.text:=result;tag:=aTag
end;aStrm.free
end;

procedure TForm1.RichEdit1Change(Sender: TObject);
begin
forcePlainText(richEdit1)
end;


Mht. til drop på panel mener jeg det ville være bedre, hvis man eksempelvis har et panel liggende under sin RichEdit/Memo, og kunne få den til at acceptere drop af tekst udefra (via dets handle), og så derefter sende dataen til memo. Kan dog stadig selv kun få dette til at virke med filer, og ikke med tekst :(
Avatar billede kroning Nybegynder
10. november 2009 - 23:58 #16
At droppe på et panel tror jeg ikke er en god løsning i mit tilfælde.
Din funktion forcePlainText giver stadig problemet med at hele teksten flimre ved hver ændring.

Dette ser ud til at virke uden flimmer, dog er der problemer med at linie afstanden ændre sig når tekst droppes fra f.eks. IE

function TForm1.ForcePlainText(aRichEdit:TRichEdit):string;
var
    RichEdit: TRichEdit;
begin
    with TRichEdit.Create(Self) do
  begin
        Width:=0;
      Parent:=Self;
        aRichEdit.DefAttributes.Assign(DefAttributes);
      Free;
  end;
end;
Avatar billede kroning Nybegynder
11. november 2009 - 00:00 #17
Det jeg mener er at linie afstanden ændre sig ved tekst drop fra IE og aRichEdit.DefAttributes.Assign(DefAttributes); retter ikke dette, kun style, farve og font rettes.
Avatar billede kroning Nybegynder
23. november 2009 - 10:49 #18
mbsnet > Vil du smide et svar
Avatar billede mbsnet Nybegynder
24. november 2009 - 05:00 #19
ok, men du må også gerne selv beholde dem (var jo ikke helt konkret)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester