Страница: 1 |
Вопрос: указатели | Добавлено: 21.02.06 16:54 |
Автор вопроса: ![]() |
У меня два вопроса по указателям, кто знает прошу помочь:
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 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 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" _ ![]() Т.е. граждане даже не указывают, что параметр функции передается по ссылке (BYREF), очевидно, для USER DEFINED это действует автоматом. И это срабатывает! Короче, попробуй по простому: function proc(x as struct) ![]() Если не сработает, попробуй привесить BYREF. На счет синхронизации с файлом не знаю. |
Номер ответа: 2 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #2 | Добавлено: 21.02.06 19:36 |
1.
function proc(struct_ponter) Dim pStruct As MyStruct PTR pStruct = struct_pointer 2. DuplicateHandle |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 257821932 Вопросов: 5 Ответов: 9 |
Профиль | Цитата | #5 | Добавлено: 22.02.06 02:07 |
Чето я рано обрадовался с этим:
процедура в которую передается указатель callback`овая и ее параметры вынемаются с помощью CBLPARAM и CBWPARAM, с помощью указания MyType=CBLPARAM все катит. На самом деле ничего не работает, вопрос еще актуален, кто знает please help me!!! видел код на дельфи, но не понял: Wnd:=TMsg(Pointer(lParam)^).hwnd; |
Номер ответа: 6 Автор ответа: ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 60 Ответов: 808 |
Профиль | Цитата | #7 | Добавлено: 22.02.06 21:07 |
Не гоните бред! Какие собаки? Здесь нужен CopyMemory. Описание в Google. |
Номер ответа: 8 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #8 | Добавлено: 22.02.06 21:34 |
Не гони бред! И очнись, это не VB!
Нахрен тут никакой CopyMemory не нужен. Пример использования указателей можно посмотреть в папке с примером поиска файлов, который идёт в пакете с PB. Называется FileFind. Там и есть работа с указателями на структуры, передаваемыми через lParam. Вот только никто не хочет читать и разбираться, всем готовое нужно ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() Вопросов: 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 ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 257821932 Вопросов: 5 Ответов: 9 |
Профиль | Цитата | #10 | Добавлено: 23.02.06 00:13 |
Посмотрев пример идущий в поставке и твой, все стало кристально ясно спасибо.
p.s: и чё это я так тупил... |
Страница: 1 |
|