Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-42361
Ross
2001-12-11 20:54
2002.01.14
ADO


1-42501
dva
2001-12-25 23:03
2002.01.14
Помогите чайнику с Таймером


1-42482
TSerg
2001-12-25 15:25
2002.01.14
Можно ли имитировать нажатие какой либо клавиши?


1-42505
JetPaul
2001-12-26 10:29
2002.01.14
Перевести программу с VB на Delphi


1-42396
Fred
2001-12-22 06:54
2002.01.14
Печать StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский