WordPad e gubav

12 отговора 356 прегледа
#1

WordPad e gubav

Ami da produljavam da vi zanimavam s razni vurposcheta. Tova veche trqbva da e bug vuv WordPad ili neshto takova. Loshoto e che polzva RichEdit20W i sledovatelno problema e s vsqka programa, koqto go polzva

Celta e da vzema selektiraniq tekst vuv RichEdit control. Purvo go napravih po tozi nachin:
function GetRichEditText(AHandle: HWND): string;
var
PC: array[0..$FFF] of Char;
const
EM_GETSELTEXT = WM_USER + 62;
begin
SendMessage(AHandle, EM_GETSELTEXT, 0, LongInt(@PC));
Result := StrPas(PC);
end;

Ako go pusna na Delphi komponent (TRichEdit) vuv moq prozorec vsi4ko e ok. Opitam li se da zadam Handle na nqkoi RichEdit v drug prozorec i izlizat greshki.

Eto i vtora realizaciq:
function GetRichEdit(AHandle: HWND): string;
const
GT_SELECTION = 2;
buflen = $FFFF;
var
buf: array[0..buflen] of Char;
gettextex: TGetTextEx;
begin
with gettextex do
begin
cb := buflen;
flags := GT_SELECTION;
codepage := CP_ACP;
lpDefaultChar := nil;
lpUsedDefChar := nil;
end;

SendMessage(AHandle, EM_GETTEXTEX,
LongInt(@gettextex), LongInt(@buf));
Result := StrPas(buf);
end;

Nqkoi da ima ideq?
10x

Toku shto si namerih otgovor (Google usenet), no mi e interesno dali znaete kude e problema

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #2

Pak ne stava

Ta problema e v tova, che EM_GETTEXTEX i EM_GETSELTEXT bachkat samo internally. Ne sa crossprocess. Poradi tova uj trqbvashe da polzvam EM_GETSEL i sled tova WM_GETTEXT (koito moje da poluchi text ot drug prozorec). E da no pak ne stava. EM_GETSEL mi vrushta nuli:

function GetRichEdit(AHandle: HWND): string;
var
i: Integer;
achBuf: array of Char;
iStart, iEnd, iLen: Integer;
begin
Result := '';
iStart := 0;
iEnd := 0;
SendMessage(AHandle, EM_GETSEL, iStart, iEnd);

if (iStart = 0) or (iEnd = 0) then Exit;

iLen := SendMessage(AHandle, WM_GETTEXTLENGTH, 0, 0);
SetLength(achBuf, iLen + 1);
SendMessage(AHandle, WM_GETTEXT, iLen, LongInt(@achBuf));
for i := iStart to iEnd do
Result := achBuf[ i ];
end;

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #3

Re: Pak ne stava

malko ma symniava tia char* kak sha sa predadat pomezhdu 2 procesa :)
da go eba v msdn-a mi ne pishe nishto za WM_GETTEXT i dali e crossprocess. za smetka na tva glei ko pishe za GetWindowText -- ako prozoreca e v syshtia process prashta WM_GETTEXT na hwnd-to, ako ne -- nai-mnogo da ti dade captiona ili ako njama - NULL
myrzi ma da probvam ama mirishe na rabotene samo v syshtia proces

ideia: prashtash WM_COPY na richedit controla i posle smuchesh ot clipboarda :)

Agent Orange
Отговор
в отговор на Waz Gaa #4

Re: WordPad e gubav

RichEdit20W e Unicode

Пламен
Отговор
в отговор на dijkstra #5

Re: Pak ne stava

WM_COPY ne me ustroiva. Iskam vsi4ko da e background i ne moga da minavam prez clipboard

P.S. A kakvo shte kajesh za SelStart i SelEnd, za koito mi vrushta nula?

by Waz Gaa
[email protected]

Редактирано от Waz Gaa на

Отговор
в отговор на Плaмeн #6

Re: WordPad e gubav

Tova ne bi trqbvalo da e prichina za greshkata.

Prochete li mi vtorata chast na postinga ?


by Waz Gaa
[email protected][email protected]</a>

Редактирано от Waz Gaa на

Отговор
в отговор на Waz Gaa #7

Uff

Izvinqvaite. Zabravil, che trqbva da se predade pointer kum Integer-a, a ne samiq toi. I stava:
SendMessage(AHandle, EM_GETSEL, LongInt(@iStart), LongInt(@iEnd));

Sorry

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #8

Final results

Iznenadan sum. Uj neshto prekarvaneto na text prez process-ite beshe nevuzmojno, no na praktika uspqh da go osushtestvq. Slednata funkciika kopira bez problem (e slojil sum ogranichenie za text do 65535 znaka) selectiraniq text ot Edit, TEdit, RichEdit20W (i proizvodni sigurno), TRichEdit. Pitam se zashto kato zadadoh Buf da e pascal string poluchih greshka vuv kernel32, a sus predvaritelno deklariran array vsi4ko e ok.

Eto i source-a. Ako nqkoi ima zabelejki vi molq da mi kajete. Plz

function GetEditSelText(AHandle: HWND): string;
const
MAXBUF = $FFFF;
var
StartPos, EndPos, TextLen, SelLen: Integer;
Text: string;
Buf: array[0..MAXBUF] of Char;
begin
//Initialize variables
Result := '';
StartPos := 0;
EndPos := 0;

//Get selection position (exit if -1 <= larger than $FFFF)
if SendMessage(AHandle, EM_GETSEL, LongInt(@StartPos),
LongInt(@EndPos)) = -1 then SelLen := -1
else SelLen := EndPos - StartPos;

//Get selected text
if SelLen > 0 then
begin
TextLen := SendMessage(AHandle, WM_GETTEXTLENGTH, 0, 0);
if (TextLen > 0) and (TextLen < MAXBUF) then
begin
SendMessage(AHandle, WM_GETTEXT, TextLen + 1, LongInt(@Buf));
Text := StrPas(Buf);
Result := Copy(Text, StartPos + 1, SelLen);
end;
end;
end;

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #9

Re: Final results

Zashtoto, WiseGuy, pametta neobhodima za vseki deklariran String se alokira dinamichno (sas SetLength).

I ako iskash da stane, triabva parvo da dadesh SetLength(S, BufSize) i sled tova da vikash s bufsize, kato eventualno si namerish kraia na stringa (#0)

Pozdravi ot SkyCode :)

Отговор
в отговор на Waz Gaa #10

Re: Final results

Привет, WizeGuy!

Не се заяждам, просто ми беше интересно да го препиша на C++.
Доста по-малко е писането :))


char *GetEditSelText (HWND AHandle)
{
DWORD StartPos, Endpos;
char *buf = NULL;
#define MAXBUF 0xFFFF

//Get selection position (exit if -1 <= larger than $FFFF)
if (SendMessage (AHandle, EM_GETSEL, &StartPos, &EndPos)) != -1) {
//Get selected text
int TextLen = SendMessage (AHandle, WM_GETTEXTLENGTH, 0, 0);
if (TextLen >= 0 && TextLen < MAXBUF) {
buf = new char[MAXBUF];
if (buf)
SendMessage (AHandle, WM_GETTEXT, TextLen + 1, (LPARAM)buf));
}
}
return buf;
}


Успехи!

Отговор
в отговор на Lucho #11

Re: Final results

Wise ne Wise, bqh go napravil tova. Estestveno, che sus WinAPI-ta i Message shte polzvam SetLength. Obijdash me taka

Ta tochno zatova se uchudih. Naloji se da polzvam predvaritelno deklariran array

Awe ostavi toq problem. Po-dobre ne se zanimavai...

by Waz Gaa
[email protected]
Отговор
в отговор на Гeнчo #12

Re: Final results

Awe ti si izpusnal da otrejesh tochno selekciqta mai :-).
Q da probvam pak. To ti baq si izrqzal. Eto pochti kato tvoq:

function GetEditSelText(AHandle: HWND): string;
const MAXBUF = $FFFF;
var StartPos, EndPos, TextLen: Integer;
Buf: array[0..MAXBUF] of Char;
begin
//Get selection position (exit if -1 <= larger than $FFFF)
if SendMessage(AHandle, EM_GETSEL, LongInt(@StartPos), LongInt(@EndPos)) = -1 then begin
TextLen := SendMessage(AHandle, WM_GETTEXTLENGTH, 0, 0);
if (TextLen > 0) and (TextLen < MAXBUF) then begin
SendMessage(AHandle, WM_GETTEXT, TextLen + 1, LongInt(@Buf));
Result := Copy(StrPas(Buf), StartPos + 1, SelLen);
end;
end;
end;

Prosto begin end si kazvat dumata. Izglejda dosta nabluskano prav si. Trqbva da pisha po minaliq nachin za da e razbiraemo. Emi nadqvam se skoro da go pochna i C-to



by Waz Gaa
[email protected]
Отговор
в отговор на Lucho #13

Eto kude e problema

Ako Buf e string, koito sum inicializiral s SetLength, ne moga da polzvam:
SendMessage(AHandle, WM_GETTEXT, TextLen + 1, LongInt(@Buf));

trebva da go napravq taka
SendMessage(AHandle, WM_GETTEXT, TextLen + 1, LongInt(PChar(Buf)));

Aide SkyCode, iznenadaite me priqtno s nqkoq qka prevodachka. Oshte li ne ste izmislili edno AI

by Waz Gaa
[email protected]
Отговор