Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 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
1.
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
                    ;DIALOG 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: и чё это я так тупил...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам