WordPad e gubav
12 отговора
356 прегледа
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]
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]
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]
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]
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
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
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]
P.S. A kakvo shte kajesh za SelStart i SelEnd, za koito mi vrushta nula?
by Waz Gaa
[email protected]
Редактирано от Waz Gaa на
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>
Prochete li mi vtorata chast na postinga ?
by Waz Gaa
[email protected][email protected]</a>
Редактирано от Waz Gaa на
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]
SendMessage(AHandle, EM_GETSEL, LongInt(@iStart), LongInt(@iEnd));
Sorry
by Waz Gaa
[email protected]
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]
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]
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 :)
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 :)
Re: Final results
Привет, WizeGuy!
Не се заяждам, просто ми беше интересно да го препиша на C++.
Доста по-малко е писането :))
Успехи!
Не се заяждам, просто ми беше интересно да го препиша на 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;
}
Успехи!
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]
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]
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]
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]
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]
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]