powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Структуры в FOXе?
11 сообщений из 11, страница 1 из 1
Структуры в FOXе?
    #32196072
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, помогите витащить переменную 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
Структуры в FOXе?
    #32196087
Samir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен только fr ?
...
Рейтинг: 0 / 0
Структуры в FOXе?
    #32196088
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, только fr.
...
Рейтинг: 0 / 0
Структуры в FOXе?
    #32196103
Samir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот например:

*** Число в строку
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
Структуры в FOXе?
    #32196150
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Структуры в FOXе?
    #32196178
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Структуры в FOXе?
    #32196199
Samir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С 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
Структуры в FOXе?
    #32219889
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IntToStr(-1) не работает, как и для прочих отрецательних чисел.
Как поступить?
...
Рейтинг: 0 / 0
Структуры в FOXе?
    #32220178
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cоздай FLL и не мучайся.
...
Рейтинг: 0 / 0
Структуры в FOXе?
    #32220497
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И шо тогда?
Всё равно мне прийдется передавать параметры. Если функция хочет видить структуру, то надо дать ей структуру. Не так ли?

Если не так, то как тогда будет виглядеть 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
Структуры в FOXе?
    #32220729
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И шо тогда?
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
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Структуры в FOXе?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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