Страница: 1 |
Страница: 1 |
Вопрос: указатели
Добавлено: 21.02.06 16:54
Автор вопроса: silently_fox | ICQ: 257821932
У меня два вопроса по указателям, кто знает прошу помочь:
1. есть переменная типа pointer передаваемая в процедуру и указывающяя на структуру, как заполнить свою идентичную структуру?
делал так:
type struct
...
...
...
end type
var_st as struct
function proc(struct_ponter)
var_st = struct_ponter
'или
var_st = @struct_ponter
end function
все это не работает
2. связать переменную с файлом файлового отоброжения(свамп) так чтобы при смене(если это вообще возможно) значения переменной менялось и в файле(в общем указывала на файл).
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
XPEHOMETP
Вопросов: 3
Ответов: 30
Профиль | | #1
Добавлено: 21.02.06 18:52
Я в РВ новичок, прошу ногами не пинать. Разбирался я тут с открытием файлов, посмотрел, как РВ вызывает стандартный диалог открытия файла. Точнее, как это прописано в ComDlg32.inc. Согласно справке от Мелкомягких, при вызове функции GetOpenFileNameA ей передается единственный параметр: УКАЗАТЕЛЬ на структуру, которая составлена из фильтров, флагов и всего прочего. И аналогичная структура описывается в ComDlg32.inc, как некий USER DEFINED тип TYPE OPENFILENAME. Можно назвать и STRUCTURE, наверно. А далее делается такой трюк: вызывается функция GetOpenFileNameA, а параметром ей записывается не УКАЗАТЕЛЬ, а САМА структура OPENFILENAME:
DECLARE FUNCTION GetOpenFileName LIB "COMDLG32.DLL" ALIAS "GetOpenFileNameA" _
 lpofn AS OPENFILENAME) AS LONG
Т.е. граждане даже не указывают, что параметр функции передается по ссылке (BYREF), очевидно, для USER DEFINED это действует автоматом. И это срабатывает! Короче, попробуй по простому:
function proc(x as struct)
 x - созданный экземпляр типа struct)
Если не сработает, попробуй привесить BYREF.
На счет синхронизации с файлом не знаю.
Номер ответа: 2
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #2
Добавлено: 21.02.06 19:36
function proc(struct_ponter)
Dim pStruct As MyStruct PTR
pStruct = struct_pointer
2.
DuplicateHandle
Номер ответа: 3
Автор ответа:
silently_fox
ICQ: 257821932
Вопросов: 5
Ответов: 9
Профиль | | #3
Добавлено: 21.02.06 19:56
Спасибо за ответ, но похоже в своем вопросе я выразился не конкретно, так что извеняюсь.
процедура в которую передается указатель callback`овая и ее параметры
вынемаются с помощью CBLPARAM и CBWPARAM,
с помощью указания MyType=CBLPARAM все катит.
Но тут возник еще вопрос, для callback`овой функции передается 3 параметра:
int code - ???
WPARAM wParam - CBWPARAM
LPARAM lParam - CBLPARAM
отуда получать первый аргумент(code - код сообщения) я так и не понял. Помогите пожалуйста.
Мне интересно почему в pb не так как в других языках, обычно в функции обратного вызова
прописываются все эти аргументы, на pb приходится их вынимать с помощью встроенных функций,
неужели напрямую прописать в аргументах нельзя?
Номер ответа: 4
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 21.02.06 21:02
Возможно code - это CBMSG или CBCTLMSG.
А вообще никто ведь не запрещает по-человечески написать
function ffff(byval code as dword, byval wParam as dword, byval lParam as dword)
и напрямую получать параметры, а не через гемморогические cb???
Номер ответа: 5
Автор ответа:
silently_fox
ICQ: 257821932
Вопросов: 5
Ответов: 9
Профиль | | #5
Добавлено: 22.02.06 02:07
Чето я рано обрадовался с этим:
процедура в которую передается указатель callback`овая и ее параметры
вынемаются с помощью CBLPARAM и CBWPARAM,
с помощью указания MyType=CBLPARAM все катит.
На самом деле ничего не работает, вопрос еще актуален, кто знает please help me!!!
видел код на дельфи, но не понял:
Wnd:=TMsg(Pointer(lParam)^).hwnd;
Номер ответа: 6
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #6
Добавлено: 22.02.06 09:03
На самом деле ничего не работает
Что не работает? Программа не запускается? Или не компилируется? Или параметры неправильно передаются? Или что???
Ты спокойно сформулируй вопрос на основе всей имеющейся у тебя информации.
Ключевое слово callback совсем не обязательно к применению, можно и без него обойтись, соответственно и без cbmsg.
видел код на дельфи, но не понял
Что тут непонятного:
Dim Wnd AS LONG
DIM pMsg AS MSG PTR
pMsg = CBLPARAM
Wnd = @pMsg.hwnd
Номер ответа: 7
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #7
Добавлено: 22.02.06 21:07
Не гоните бред! Какие собаки? Здесь нужен CopyMemory. Описание в Google.
Номер ответа: 8
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #8
Добавлено: 22.02.06 21:34
Не гони бред! И очнись, это не VB!
Нахрен тут никакой CopyMemory не нужен.
Пример использования указателей можно посмотреть в папке с примером поиска файлов, который идёт в пакете с PB. Называется FileFind. Там и есть работа с указателями на структуры, передаваемыми через lParam.
Вот только никто не хочет читать и разбираться, всем готовое нужно
Номер ответа: 9
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #9
Добавлено: 22.02.06 21:41
Вот пример CALLBACK с передачей указателей на структуры NM_LISTVIEW, LV_DISPINFO через lParam и без каких-либо CopyMemory
CALLBACK FUNCTION DlgProc
LOCAL pNMLV AS NM_LISTVIEW PTR
LOCAL pLVDI AS LV_DISPINFO PTR
LOCAL szPath AS ASCIIZ * %MAX_PATH
LOCAL szName AS ASCIIZ * %MAX_PATH
SELECT CASE CBMSG
CASE %WM_COMMAND
IF CBCTLMSG <> %BN_CLICKED THEN EXIT SELECT
SELECT CASE CBCTL
CASE %IDC_BTNFIND
StartAction 'Start a file search procedure
CASE %IDCANCEL
 IALOG END CBHNDL 'Exit
CASE %IDC_BTNPATH
IF LEN(GetFolder(CBHNDL)) THEN
CONTROL SET TEXT CBHNDL, %IDC_TXT1, gStartPath
END IF
CASE %IDC_BTNHELP
LOCAL txt AS STRING
txt = "Double-click on a search result to view the file." & $CRLF & _
"Sort columns by clicking on the ListView headers." & $NUL
MessageBox CBHNDL, BYVAL STRPTR(txt), "Quick help...", %MB_ICONASTERISK
END SELECT
CASE %WM_DESTROY
' Ensure eventual recursive action is broken on exit
gAbort = 1
CASE %WM_NCACTIVATE ' On return from other programs
IF CBWPARAM THEN
IF SendMessage(ghListView, %LVM_GETITEMCOUNT, 0, 0) THEN ' If listview has items
CONTROL SET FOCUS CBHNDL, %IDC_LISTVIEW ' Set focus to listview
ELSE
CONTROL SET FOCUS CBHNDL, %IDC_BTNFIND ' Else set focus to Search button
END IF
END IF
CASE %WM_NOTIFY
' Handle ListView notifications only
IF LOWRD(CBWPARAM) <> %IDC_LISTVIEW THEN EXIT SELECT
' Obtain the NM_LISTVIEW pointer from CBLPARAM
pNMLV = CBLPARAM
SELECT CASE @pNMLV.hdr.code
CASE %LVN_GETDISPINFO 'virtual ListView asks for Item text
pLVDI = CBLPARAM
IF (@pLVDI.item.mask AND %LVIF_TEXT) THEN
szName = PARSE$(gFiles(@pLVDI.item.iItem), $TAB, _
@pLVDI.item.iSubItem + 1)
@pLVDI.item.pszText = VARPTR(szName)
END IF
CASE %LVN_COLUMNCLICK ' Click on column header
IF @pNMLV.iSubItem <> -1& THEN
SortColumn @pNMLV.iSubItem + 1 ' Sort clicked column
END IF
CASE %NM_DBLCLK ' If double-click in ListView,
IF @pNMLV.iItem > -1 THEN ' then use ShellExecute to show file.
ListView_GetItemText ghListView, @pNMLV.iItem, 1, szPath, SIZEOF(szPath)
ListView_GetItemText ghListView, @pNMLV.iItem, 0, szName, SIZEOF(szName)
ShellExecute 0, "open", szPath & szName, "", "", %SW_SHOW
END IF
END SELECT
END SELECT
END FUNCTION
Разобраться что к чему несложно.
Номер ответа: 10
Автор ответа:
silently_fox
ICQ: 257821932
Вопросов: 5
Ответов: 9
Профиль | | #10
Добавлено: 23.02.06 00:13
Посмотрев пример идущий в поставке и твой, все стало кристально ясно спасибо.
p.s: и чё это я так тупил...