Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 732

/ вопрос открыт /

Здравствуйте, уважаемые эксперты! Давно я у вас не был, потому что на С программировал, но теперь вернулся на Дельфи. И сразу вопрос: мне нужно сделать программу учета трафика на выбранных интерфейсах. На данный момент я хочу осуществить перебор возможных интерфейсов и создания вкладок на PageControl в соответствии каждому интерфейсу. Но при их переборе возникает Exception. Не могу понять в чем проблема. Код прикреплен... Заранее благодарю!

Приложение:
  1. procedure TMain.UpdateInterface;
  2. var
  3. FLibHandle: THandle;
  4. Table: TMibIfTable;
  5. i, Size: integer;
  6. tab: TTabSheet;
  7. frm: TFrame;
  8. s: string;
  9. begin
  10. tmr1.Enabled:=false;
  11. FLibHandle:=LoadLibrary('IPHLPAPI.DLL');
  12. if FLibHandle = 0 then Exit;
  13. @GetIfTable:=GetProcAddress(FLibHandle, 'GetIfTable');
  14. if not Assigned(GetIfTable) then
  15. begin
  16. FreeLibrary(FLibHandle);
  17. Close;
  18. end;
  19. Size:=SizeOf(Table);
  20. if GetIfTable(@Table,@Size,false) = 0 then
  21. for i:=0 to Table.dwNumEntries - 1 do
  22. begin
  23. tab:=TTabSheet.Create(spgcntrl1);
  24. with tab do
  25. begin
  26. Visible:=True;
  27. Caption:=string(Table.Table[i].bDescr);
  28. PageControl:=spgcntrl1;
  29. end;
  30. frm:=TFrame.Create(Main);
  31. frm.Parent:=tab;
  32. frm.Align:=alClient;
  33. end;
  34. EnumInterfaces(s);
  35. FreeLibrary(FLibHandle);
  36. end;


Жикльор Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Жикльор (статус: 5-ый класс)
Вопрос отправлен: 15 ноября 2010, 22:25
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Не понимаю, что у тебя там творится.
Я тут написал тебе простейший пример с динамическим созданием/удалением вкладок в PageControl. Посмотри.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 ноября 2010, 11:31


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 19 ноября 2010, 08:22; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 16 ноября 2010, 00:37 [#1]:

кажется мне, что ошибка в районе строки EnumInterfaces(s);
или где то в другом месте выдает? Укажите точно строку.
Галочка "подтверждения прочтения" - вселенское зло.
Жикльор

Жикльор (статус: 5-ый класс), 16 ноября 2010, 01:31 [#2]:

Проблема не в синтаксисе, а в семантике. Программа запускается, но при нажатии на кнопку, которая вызывает эту процедуру, происходит вылет с программы EAccessViolation.
EAccessViolation
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 16 ноября 2010, 08:32 [#3]:

Попробуй-ка вот так:
  if GetIfTable(@Table,@Size,false) = 0
    then for i:=0 to Table.dwNumEntries - 1 do
           begin
             tab:=TTabSheet.Create(spgcntrl1);
             with tab do
               begin
                 Parent:=      spgcntrl1;                   // <---
                 PageControl:= spgcntrl1;                   // <---
                 Caption:=string(Table.Table[i].bDescr);
               end;
 
             frm:=TFrame.Create(tab);  // <---
             frm.Parent:=tab;
             frm.Align:=alClient;
           end;
Если ошибка будет появляться, пройдись по коду дебаггером и найди, где возникает ошибка. Тогда будем дальше разбираться.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 16 ноября 2010, 18:54 [#4]:

При попытке присвоить PageControl:=spgcntrl1; выбрасывает. Когда его убираю - весь код проходит нормально, но вкладки не появляются.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 17 ноября 2010, 08:18 [#5]:

Цитата (Жикльор):

При попытке присвоить PageControl:=spgcntrl1; выбрасывает

Как это понимать? Куда чего выбрасывает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 17 ноября 2010, 10:57 [#6]:

Цитата:

Куда чего выбрасывает?

Ну опять та же ошибка EAccessViolation. Которая на скрине выше.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 17 ноября 2010, 11:14 [#7]:

spgcntrl1 - это точно TPageControl?
Ты копаешь мой код или свой?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 17 ноября 2010, 17:51 [#8]:

Да, я в этом уверен. Добавляю в design-time новые страницы - в общем все работает в дизайне, а в run-timе нет. Код взял твой и запустил с брейкпоинтом на вызове процедуры. На этой строчке, что я указал, вызывает EAccessViolation.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

Жикльор (статус: 5-ый класс), 17 ноября 2010, 17:58 [#9]:

Вопрос решен, всем спасибо=) Позже также будут вопросы, но пока все по плану. Дело было в том, что я использую AlphaSkins нужен класс не TTabSheet, а TsTabSheet - после редактирования этих 2-ух строк - все заработало.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 08:20 [#10]:

Цитата (Жикльор):

Дело было в том, что я использую AlphaSkins нужен класс не TTabSheet, а TsTabSheet - после редактирования этих 2-ух строк - все заработало.


#$%$#%&^$&*^&#@$@$@#$@^!!! - сказал я, а затем грязно выругался!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 18 ноября 2010, 12:24 [#11]:

Цитата:

#$%$#%&^$&*^&#@$@$@#$@^!!! - сказал я, а затем грязно выругался!

Ну затупил я немного, не заметил этого нюанса.
И как теперь на каждой странице создать лейблы?
Label1.Parent:=spgnctrl1.Pages[i];
?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 12:45 [#12]:

Цитата (Жикльор):

И как теперь на каждой странице создать лейблы?

Хорош фигнёй заниматься, напиши свой класс-наследник от TsTabSheet, а в его конструкторе создавай все дочерние элементы. Так будет сильно проще, я так всегда делаю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 18 ноября 2010, 23:56 [#13]:

Я никогда не писал свои классы((( Дай хоть ссылку, что мне нужно читать для этого...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 19 ноября 2010, 08:22 [#14]:

Вот тебе примеры. Это 2 модуля одного из моих проектов, в которых как раз создаются классы-потомки таких классов как:

  • TTabSheet;
  • TPageControl;
  • TTreeNode;
  • TTreeView.

Туева хуча комментариев в коде. Попробуй почитать и понять, как чего делается.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.