Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wnaspi32.dll, Работа с библиотекой на чистом WIN32API? 
V
    Опции темы
Rouse_
Дата 17.5.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



чему равен ItemIndex на момент вызова данной функции:
Код

_Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 17.5.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



На момент вызова 
_Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;
прога вылетает. (Рантайм эррор)

Добавлено @ 15:57 
Стоп. я понял вопрос. 
ItemIndex должен зацепить текущий выбранный пункт, а потом уже:
_Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;
Или я ошибаюсь? 
PM MAIL   Вверх
Rouse_
Дата 17.5.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



угу smile 
вообщето ItemIndex должен быть номером существующего итема... Не важно, выбран он или нет 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 17.5.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Так?
ItemIndex = SendMessage(Combobox1, CB_GETCURSEL, 0, 0);

Если нет, то как его определить? 
PM MAIL   Вверх
Rouse_
Дата 17.5.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



да, это тебе вернет текущий выбранный элемент... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 18.5.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



CD_ROM_DEVICE в любом случае возвращает один и тот же идентификатор. какое бы устройство в комбобоксе я не выбрал, получается одно и то же. При этом я правильно обрабатываю сообщение, которое отвечает за изменения в комбобоксе. может, ошибка при добавлении - CB_SETITEMDATA?

Код

var
 CD_ROM_DEVICE: TDeviceID;
 Combobox1: HWND;
 ItemIndex: Integer;

function ASPIEnumCallBack(lpUserData : pointer; Device : TDeviceID) : boolean;
var
 SDInfo: TScsiDeviceInfo;
 DriveInfo: string;
begin
 SCSIinquiryDeviceInfo(Device, SDInfo, SCSI_DEF);
 DriveInfo := SDInfo.ProductID + '   (' + SDInfo.VendorID + ')';

 ItemIndex := SendMessage(ComboBox1, CB_ADDSTRING, 0, Integer(DriveInfo));
 SendMessage(combobox1, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));

 Result := True; //to continue scanning
end;

.............

WM_INITDIALOG:
 begin
  combobox1 := GetDlgItem(hWin, 11);
   if AspiEnumDevices(TSDCDROM, @ASPIEnumCallBack, @hWin) > 0 then begin
     ComboBox_SelectedItem(combobox1, 0);
         ItemIndex = SendMessage(Combobox1, CB_GETCURSEL, 0, 0);
         _Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;
        CD_ROM_DEVICE := TDeviceID(_Object);
      ebd;
    end;

.............

 
PM MAIL   Вверх
WIN32API
Дата 18.5.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Хочу заметить, что получаемый идентификатор неверный, т.к. немогу управлять устройством. 
PM MAIL   Вверх
Rouse_
Дата 18.5.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Естественно он вернет тебе один и тот же обьект, потомучто ты после добавление нового элемента назначешь обьект связанный с ним всем существующим элементам, затирая их предыдущее значение:
Код

 for ItemIndex := 0 to ComboBox_GetItemCount(combobox1) - 1 do
   SendMessage(combobox1, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 18.5.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Все равно получаю один и тот же идентификатор, который так и неработает.

Код

type
  PObject = ^TObject;

var
 CD_ROM_DEVICE: TDeviceID; //type TdeviceID  = type DWORD;
 Combobox1: HWND;
 ItemIndex: Integer;
 _Object: TObject;

function ASPIEnumCallBack(lpUserData : pointer; Device : TDeviceID) : boolean;
var
 SDInfo: TScsiDeviceInfo;
 DriveInfo: string;
begin
 SCSIinquiryDeviceInfo(Device, SDInfo, SCSI_DEF);
 DriveInfo := SDInfo.ProductID + '   (' + SDInfo.VendorID + ')';
 ItemIndex := SendMessage(ComboBox1, CB_ADDSTRING, 0, Integer(DriveInfo));
  for ItemIndex := 0 to ComboBox_GetItemCount(ComboBox1) -1 do
   SendMessage(combobox1, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));
 Result := True; //to continue scanning
end;

function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
begin
 Result := False;
  case uMsg of
   WM_INITDIALOG:
    begin
     combobox1 := GetDlgItem(hWin, 11);
      if AspiEnumDevices(TSDCDROM, @ASPIEnumCallBack, @hWin) > 0 then
       ComboBox_SelectedItem(combobox1, 0);
     ItemIndex := SendMessage(Combobox1, CB_GETCURSEL, 0, 0);
     _Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;
     CD_ROM_DEVICE := TDeviceID(_Object);
    end;
  WM_COMMAND:
   begin
    case HIWORD(wp) of
     //При изменениях в Combobox1 меняем устройство - CD_ROM_DEVICE
     CBN_SELCHANGE:
      begin
       ItemIndex := SendMessage(Combobox1, CB_GETCURSEL, 0, 0);
       _Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;
       CD_ROM_DEVICE := TDeviceID(_Object);
       //messagebox(0,pchar(inttostr(CD_ROM_DEVICE)),'',0);
      end;
    end;
    //Обработка кнопок на диалоговом окне
    case LoWord(wp) of
     30: SCSIstartStopUnit(CD_ROM_DEVICE, False, True, True, SCSI_DEF); //Open CD Door
     31: SCSIstartStopUnit(CD_ROM_DEVICE, True, True, True, SCSI_DEF); //Close CD Door
      1: EndDialog(hWin, 0);
    end;
   end;
  WM_DESTROY, WM_CLOSE: PostQuitMessage(0);
 end;
end;
 
PM MAIL   Вверх
Rouse_
Дата 19.5.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Блин, чудак человек, закоментируй вот эту строку:
Код

for ItemIndex := 0 to ComboBox_GetItemCount(ComboBox1) -1 do
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 19.5.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Да тоже самое. Я уже запахался честно говоря... 
PM MAIL   Вверх
Rouse_
Дата 19.5.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Что тоже самое? Для всех элементов один и тот же обьект возвращается или теперь они разные? 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 19.5.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Для всех элементов один и тот же обьект возвращается!!! Бред какой-то... 
PM MAIL   Вверх
Rouse_
Дата 22.5.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Давай сюда проект... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 23.5.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Мой проект можно закачать по адресу:
Wnaspi32 
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.