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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 6 565

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

Доброго времени суток!
Пытаюсь реализовать работу с вкладками TabControl.
По какой-то причине некорректно работает
// Ищем пользователя на вкладках
i := TabControl1.Tabs.IndexOfObject(UsrData);

Приложение:
  1. {{code|delphi}}
  2. unit frm_Main;
  3.  
  4. ...
  5.  
  6. var
  7. FormMain: TFormMain;
  8.  
  9. implementation
  10.  
  11. uses frm_2;
  12.  
  13. {$R *.dfm}
  14.  
  15. procedure TFormMain.Button1Click(Sender: TObject);
  16. var
  17. i: Integer;
  18. Item: TListItem;
  19. begin
  20. LVUsers.Clear;
  21.  
  22. for i := 0 to 4 do
  23. begin
  24. Item := LVUsers.Items.Add;
  25. Item.Caption := '';
  26. Item.SubItems.Add(Format('Name: %d', [i])); // Name
  27. Item.SubItems.Add(Format('30%d', [i])); // Room
  28. Item.SubItems.Add(IntToStr(i)); // ID
  29. Item.SubItems.Add('0'); // Icon
  30. Item.ImageIndex := 0;
  31. end;
  32. end;
  33.  
  34. procedure TFormMain.LVUsersDblClick(Sender: TObject);
  35. begin
  36. if LVUsers.Selected = nil then Exit;
  37. Form2.ProcAddTab(LVUsers.Items[LVUsers.ItemIndex], True, True);
  38. end
  39.  
  40. end.
  41.  
  42.  
  43.  
  44. unit frm_2;
  45.  
  46. interface
  47.  
  48. uses
  49. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  50. Dialogs, Menus, StdCtrls, ComCtrls, ToolWin, ExtCtrls, Contnrs;
  51.  
  52. type
  53. TTabData = class(TObject)
  54. public
  55. UserID: Integer;
  56. Nick: string;
  57. TempMessage: string;
  58. end;
  59.  
  60. TTabDataList = class(TObjectList)
  61. private
  62. function GetTab(Index: Integer): TTabData;
  63. public
  64. function AddTab(UserID: Integer; Nick, TempMessage: string): TTabData;
  65. property Tabs[Index: Integer]: TTabData read GetTab; default;
  66. end;
  67.  
  68. type
  69. TForm2 = class(TForm)
  70. ...
  71. private
  72. { Private declarations }
  73. public
  74. { Public declarations }
  75. procedure ProcAddTab(Usr: TListItem; ChangeTab, ShowForm: Boolean);
  76. end;
  77.  
  78. var
  79. Form2: TForm2;
  80. TabList: TTabDataList;
  81. tbInd: Integer;
  82. UserData: TTabData;
  83.  
  84. implementation
  85.  
  86. uses frm_Main;
  87.  
  88. {$R *.dfm}
  89.  
  90. function TTabDataList.AddTab(UserID: Integer; Nick, TempMessage: string): TTabData;
  91. begin
  92. Result := TTabData.Create;
  93. Result.UserID := UserID;
  94. Result.Nick := Nick;
  95. Result.TempMessage := TempMessage;
  96. inherited Add(Result);
  97. end;
  98.  
  99. function TTabDataList.GetTab(Index: Integer): TTabData;
  100. begin
  101. Result := inherited Items[Index] as TTabData;
  102. end;
  103.  
  104. procedure TForm2.FormCreate(Sender: TObject);
  105. begin
  106.  
  107. end;
  108.  
  109. procedure TForm2.FormDestroy(Sender: TObject);
  110. begin
  111. FreeAndNil(TabList);
  112. end;
  113.  
  114. procedure TForm2.ProcAddTab(Usr: TListItem; ChangeTab, ShowForm: Boolean);
  115. var
  116. UsrData: TTabData;
  117. i: Integer;
  118. begin
  119. UsrData := Usr.Data;
  120.  
  121.  
  122. begin
  123.  
  124. UsrData := TabList.AddTab(StrToInt(Usr.SubItems[2]), Usr.SubItems[0], '');
  125.  
  126. Usr.Data := UsrData;
  127. end;
  128.  
  129. i := TabControl1.Tabs.IndexOfObject(UsrData);
  130.  
  131.  
  132. begin
  133. i := TabControl1.Tabs.Add(UsrData.Nick);
  134.  
  135. TabControl1.Tabs.Objects[i] := UsrData;
  136. end;
  137.  
  138. if ChangeTab then
  139. begin
  140.  
  141. TabControl1.TabIndex := i;
  142. end;
  143.  
  144. if ShowForm then
  145. begin
  146. Self.WindowState := wsNormal;
  147. Self.Show;
  148. end;
  149. end;
  150.  
  151. end.
  152. {{/code}}
  153.  
  154. {{code|delphi}}
  155. UsrData := Usr.Data; //1: UsrData = nil; 2: UsrData = nil
  156.  
  157.  
  158. begin
  159.  
  160. UsrData := TabList.AddTab(StrToInt(Usr.SubItems[2]), Usr.SubItems[0], ''); //1: UsrData = '0', 'Name: 0'; 2: UsrData = '0', 'Name: 0'
  161.  
  162. Usr.Data := UsrData; //1: Usr.Data = (0, 'Name: 0', ''); 2: Usr.Data = (0, 'Name: 0', '')
  163. end;
  164.  
  165. i := TabControl1.Tabs.IndexOfObject(UsrData); //1: i = '-1'; 2: i = -1
  166.  
  167.  
  168. begin
  169. i := TabControl1.Tabs.Add(UsrData.Nick); //1: i = 'Name: 0'; 2: i = 'Name: 0'
  170.  
  171.  
  172. end;
  173. {{/code}}


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

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 9 октября 2014, 15:17
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 3; последнее сообщение — 11 октября 2014, 07:45; участников в обсуждении: 2.
Shouldercannon

Shouldercannon (статус: Посетитель), 9 октября 2014, 16:03 [#1]:

Если пересоздать список пользователей в ListView и кликать по этим записям, то в TabControl появляться дубликаты уже имеющихся/открытых вкладок.
min@y™

min@y™ (статус: Доктор наук), 10 октября 2014, 16:28 [#2]:

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

Shouldercannon (статус: Посетитель), 11 октября 2014, 07:45 [#3]:

Да вот как-то так

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

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