Форум: "WinAPI";
Текущий архив: 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 не надо :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c