Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Структуры в FOXе? / 11 сообщений из 11, страница 1 из 1
01.07.2003, 13:24
    #32196072
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
Народ, помогите витащить переменную fr!!!!!!

Как мне перевести с VisualBasic на VFP нижеследующий код?


Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Type CharRange
cpMin As Long
cpMax As Long
End Type

Public Type FormatRange
hdc As Long
hdcTarget As Long
rc As RECT
rcPage As RECT
chrg As CharRange
End Type

Dim fr As FormatRange

fr.hdc = hdc
fr.hdcTarGet = Printerhdc
fr.chrg.cpMin = NextCharPos
fr.chrg.cpMax = -1
fr.rc = rcDrawTo
fr.rcPage = rcPage
SendMessage(rtf.hwnd, EM_FORMATRANGE, True, fr)
...
Рейтинг: 0 / 0
01.07.2003, 13:34
    #32196087
Samir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
Нужен только fr ?
...
Рейтинг: 0 / 0
01.07.2003, 13:35
    #32196088
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
Да, только fr.
...
Рейтинг: 0 / 0
01.07.2003, 13:44
    #32196103
Samir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
Вот например:

*** Число в строку
FUNCTION IntToStr
LPARAMETERS nInt
RETURN CHR(FLOOR(nInt%256)) + ;
CHR(FLOOR(nInt/256%256)) + ;
CHR(FLOOR(nInt/(256**2)%256)) + ;
CHR(FLOOR(nInt/(256**3)))
ENDFUNC

fr = IntToStr(hdc) + IntToStr(Printerhdc) + IntToStr(NextCharPos) + IntToStr(-1) + IntToStr(rcDrawTo) + IntToStr(rcPage)

SendMessage(rtf.hwnd, EM_FORMATRANGE, True, fr)

*** fr - объяви как строку
...
Рейтинг: 0 / 0
01.07.2003, 14:10
    #32196150
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
fr - как строку?

Вот описание API функции SendMessage:
function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;
Не надо ли потом делать чтото вроде StrToInt?

Интересно, если тип будет посложнее, например

Public Type FormatRange
hdc As Long
hdcTarget As Word
rc As String
rcPage As Long
End Type

Что тогда?
Просто, если можите объясните как ето делать для любых структур.
Что озачает CHR(FLOOR(nInt/256%256)) ?

Спасибо.
...
Рейтинг: 0 / 0
01.07.2003, 14:27
    #32196178
NNN
NNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
...
Рейтинг: 0 / 0
01.07.2003, 14:39
    #32196199
Samir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
С API в Фоксе немного трудновато, особенно если функция принимает структуру, но пока все получалось.

Принцип такой:
Функции передается область памяти, а не сами переменные или структуры. Необходимо правильно создать эту область.

Например число 25 в двоичном виде выглядит так:
0001 1001 - как 2 байта
0000 0000 0001 1001 - как 4 байта

а строка полученная с помощью IntToStr(25) в двоичном виде будет выглядеть так же - 0000 0000 0001 1001
то есть все структуры превращаю в строки

Ну а в сложных структурах то же самое. Например
[Наша строка] = IntToStr(число) + [длина строки Х] + [строка Х]

Ну а с TRUE - FALSE
#DEFINE TRUE 0x0001
#DEFINE FALSE 0x0000

и т.д.
...
Рейтинг: 0 / 0
28.07.2003, 18:50
    #32219889
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
IntToStr(-1) не работает, как и для прочих отрецательних чисел.
Как поступить?
...
Рейтинг: 0 / 0
29.07.2003, 09:37
    #32220178
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
Cоздай FLL и не мучайся.
...
Рейтинг: 0 / 0
29.07.2003, 12:26
    #32220497
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
И шо тогда?
Всё равно мне прийдется передавать параметры. Если функция хочет видить структуру, то надо дать ей структуру. Не так ли?

Если не так, то как тогда будет виглядеть FLL на примере функции SendMessage:

function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;
(DECLARE INTEGER SendMessage IN user32 INTEGER hWnd, INTEGER Msg, INTEGER wParam, String lParam - так делал я)

lParam - это структура (описание в первом сообщении (FormatRange)).
И как потом вызвать этот SendMessage?

Буду очень благодарен, на API функциях можно сделать много интересных вещей...
...
Рейтинг: 0 / 0
29.07.2003, 13:39
    #32220729
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры в FOXе?
И шо тогда?
1. Тогда ты избавишься от "гемороя" преобразования типов данных и составления блока памяти ссылку на котороый тебе нужно запихнуть в функци и разбора буфера результатов для "сложных" функций.
2. Сможешь работать со структурами элементы которой тоже представляют собой ссылку на структуру.
3. Вот чего-чего, а при использовании FLL проблем с передачей параметров нет.
Ты же знаешь какое сообщение будешь передавать ? - Знаешь. параметры которые нужно запихать в элементы структуры знаешь ? Знаешь.
Тогда какие проблемы?

Код твой будет выглядеть примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Set library MyFLL additive
#define WM_USER                         0x0400
#define EM_FORMATRANGE	(WM_USER +  57 )
Local lcCapWnd
lcCapWnd =  allt(thisform.caption)
Declare Integer FindWindow in Win32Api integer, string @
HWnd  = FindWindow( 0 ,lcCapWnd)
 = MySendMsg(HWnd, EM_FORMATRANGE)



Всё равно мне прийдется передавать параметры. Если функция хочет видить структуру, то надо дать ей структуру. Не так ли?
Конечно. Только тут стоит вопрос, не ЧТО, а КАК.
Если не так, то как тогда будет виглядеть FLL на примере функции
В простейшем случе можешь сделать так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#include <string.h>
#include <Pro_ext.h>
#include <process.h>
far SendMsg(ParamBlk FAR *parm)
{
#define p0 (parm->p[ 0 ].val)
#define p1 (parm->p[ 1 ].val)
HWND hwnd;
UINT Msg;
FORMATRANGE FR;
RECT R;
CHARRANGE CR;
LONG        lRez;
hwnd =  (HWND) p0.ev_long;
Msg   =  (UINT)  p1.ev_long;
 /* FR  -  тут просто заполнил свою структуру ручками и пихнул, а если не ручками а динамически, то дополни параметры в FoxInfo и принимай последсвом струтктуры ParamBlk  */ 
lRez = SendMessage(hRTFWnd, EM_FORMATRANGE, FALSE, (LPARAM)&FR);
 return ( 0 );
}

FoxInfo myFoxInfo[] = {
	{ "MySendMsg" ,(FPFI) SendMsg,        2 ,  "II" },
};

FoxTable _FoxTable = {
	(FoxTable  *)  0 , sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};



/* Если хочешь передавать больше параметров то переопредели связку в
FoxInfo. Устройство к которому надо доставить и конечное устройство, под которое происходит форматирование можешь определить тут. Вообщем вариантов в таком случе много.
Все.
И вообще , можешь при таком подходе получить все что хочешь от системы,
что не может фокс.
*/
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Структуры в FOXе? / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]