Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Вниз

Как получить текст из ячеек TstringGrid в чужом окне? Handle я знаю. 


Shmel   (2001-11-06 01:07) [0]

Как получить текст из ячеек TstringGrid в чужом окне? Handle я знаю.



Alien   (2001-11-06 01:18) [1]

Ничего тебе этот хэндл не даст. В WinAPI нет никаких TStringGrid-ов. Твоя постановка задачи равносильна примерно следующей: "Имеется картинка Bitmap у которой в правом нижнем углу что-то написано(читай нарисовано). Как мне это прочитать?" Если знаешь ответ на этот вопрос, тогда и из своего grid-а прочитаешь...



DMN   (2001-11-06 03:03) [2]

Если н допускает редактирование - надо слать ему стрелочки, обходя ячейку за ячейкой, искать хэндл TInplaceEdit"а, сидящего внутри этого грида и читать текст из него...



Alien   (2001-11-06 06:54) [3]

>DMN © (06.11.01 03:03)
Вы что издеваетесь?... какие "ячеички", какие TInplaceEdit-ы в WinAPI?



DMN   (2001-11-06 10:20) [4]

:) A что, TStringGrid - это не TWinControl? Вполне... И клавиши ему можно слать... А в процессе редактирования он создает child control TInplaceEdit, который вполне можно добыть с помощью EnumChildWindows. А кладет он в этот TInplaceEdit содержимое текущей ячейки, которое добывается при помощи WM_GETTEXT... Сдается мне, ничего невозможного пока нет?..



Alien   (2001-11-06 15:35) [5]

> DMN © (06.11.01 10:20)
Вы на название форума сморели? Забудьте приставку Tx...



Shmel   (2001-11-07 18:43) [6]

прошу прощения уважаемые мастера, чуть расшифрую:
Есть TWincontrol (Что-то типа TDrawGrid (а может Tlist хитрый)) на него Handle, весь облом что он ReadOnly :(

Я тут порыл похожую задачу на Api, но она на C++ , я его не могу транслировать в Delphi (не понимаю :
comp=(TWinControl*)h;
TPropInfoList* List;)


Прошу прощения за длинный пример (он берет текст из Assemblera):

Как это сделать.
1) Внедрить dll
2) По описанному ранее способу получить указатель на форму.
3) Получить список компонент с свойствами.
4) Поменять у DisassemblerView1 свойство OnKeyDown (у него нет на это событие
обработчика)
5) В этом событии написать такой код:
AnsiString s2=GetStrProp(Sender,type);//Значение нужного свойства
// оно в данном случае будет SelectedDisassembly

//Функцию - обработчик надо воткнуть в класс VCL для того, чтобы избавиться от closure!
//Дело в том, что указатель на KeyDown1 на самом деле 8 байт.
// 4 - адрес функции, 4 - сам объект
class TC: public TCustomControl //Какой нибудь класс
{
public:
__fastcall TC(TComponent* Owner);
void __fastcall KeyDown1(TObject *Sender, WORD &Key,
TShiftState Shift);
};
__fastcall TC::TC(TComponent* Owner): TCustomControl(Owner){}


TPropInfo* type;
void __fastcall TC::KeyDown1(TObject *Sender, WORD &Key,
TShiftState Shift)
{
AnsiString s2=GetStrProp(Sender,type);//Значение нужного свойства
// оно в данном случае будет SelectedDisassembly
//Теперь например вывод на экран этой строки
HDC dc = GetDC(0);
TextOut(dc,20,40,s2.c_str(),s2.Length());
ReleaseDC(0,dc);
}
Свойства у DisassemblerView1 следующие(значения их я вывел через integer, для
упрощения)
....
TopAddress(Тип Integer) = 2012871136
Visible(Тип Boolean) = 1
Width(Тип Integer) = 469
SelectedDisassembly(Тип String) = 88 //самая главная

//Функция получения указателя на control
//Handle должен быть формы
//Считается, что dll уже внедрена
BOOL CALLBACK WinPropProc(
HWND hwndSubclass, // handle of window with property
LPCSTR lpszString, // property string or atom
LPARAM DATA) // data handle
{
TCHAR tchBuffer[4096]; // expanded-string buffer

HANDLE h=GetProp(hwndSubclass,lpszString);

TWinControl* comp;
comp=(TWinControl*)h;
AnsiString s=lpszString;
comp=(TWinControl*)h;
try{
int I, J;
TComponent* C;
String CompName, PropName;
//В TTypeKinds внесены все варианты, чтобы получить все свойства
TTypeKinds k;k<< tkUnknown<< tkInteger<< tkChar<< tkEnumeration<<
tkFloat;
k<<tkString<<tkSet<<tkClass<<tkMethod<<tkWChar<<tkLString<<tkWString<<tkVariant
<<tkArray;
k<<tkRecord<<tkInterface<<tkInt64<<tkDynArray;
TPropInfoList* List;
C = comp->FindComponent("DisassemblerView1");
List = new TPropInfoList(C, k);
try
{
for(int j = 0;j<List->Count;j++)
{
AnsiString s1;
s1=List->Items[j]->Name;
if(s1=="OnKeyDown")
{
TMethod d;
void __fastcall ( __closure *myClosure )(TObject *Sender, WORD
&Key, TShiftState Shift);
myClosure=tc->KeyDown1;
//Объединение для разбиения на функцию и объект
union P
{
void* t;
void* k;
void __fastcall ( __closure *myClosure )(TObject *Sender,
WORD &Key,
TShiftState Shift);
};
P p;
p.myClosure=myClosure;
d.Code=p.t;d.Data=p.k;
SetMethodProp(C,List->Items[j],d);//Поставить свой обработчик на onKeyDown
}
if(s1=="SelectedDisassembly")//Если нужное свойство, то запомнить
его
{
type= List->Items[j];
}
}
}
catch(...)
{
}
return false;
}
catch(...)
{
return TRUE;
}
Вызвав эту функцию, Вы устанавливаете обработчик KeyDown1 для
DisassemblerView1. А в этом обработчике используя
s2=GetStrProp(Sender,type);//Получить начение нужного свойства
вы получаете доступ к нужным данным.

И еще. Раньше считалось, что если Вы используете событие OnDrawDataCell или
что то похожее для отрисовки на гриде и т.д. данных, то Вы защитили их от
метода предложенного выше. Это ошибочное мнение. Данные эти можно вытащить. И
не так уж сложно, если вспомнить, что рисуются они в основном функциями
TextOut и DrawText, куда передается указатель на эти данные.

P.S.
Или может кто подскажет примерчик работы с EnumProps c CallBack



Shmel   (2001-11-08 21:09) [7]

Ну неужели никто с EnumProps не работал !!! Повешусь :(



Shmel   (2001-11-09 23:48) [8]

Вот млин, никто не знает, а ведь делают как то!!!
Пришлось с помощью Kleptomania + MacrosExpert эту задачу решать :(
А хотелось бы черыз API. Какие перспективы открываются :)
Если кто-то нароет что нибудь по EnumProps, скиньте мне, жжутко интересно. (только стандартного описания из Help не надо :)




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.026 c
4-42593           Evgeny                2001-11-08 13:34  2002.01.14  
Создание Bitmap в API


1-42411           Bar                   2001-12-25 20:34  2002.01.14  
GetVolumeInformation неодинаково ведет себя под 98/Me и NT


3-42348           BAS                   2001-12-06 13:07  2002.01.14  
Жрет память TOraSQL в ODACе


4-42611           Kan                   2001-11-14 11:36  2002.01.14  
Самоуничтожающаяся программа


1-42465           Smok_er               2001-12-20 04:37  2002.01.14  
Вращение TImage