Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2010, 15:56   #1
SoftKoc
Форумчанин
 
Аватар для SoftKoc
 
Регистрация: 07.11.2009
Сообщений: 218
Сообщение Динамический массив TSpeedButton

Здравствуйте
Создаю динамический массив TSpeedButton:
Код:
Var
  SB: array of TSpeedButton;
Указываю Count :
Код:
 SetLength(SB, 10);
Создаю SpeedButton:
Код:
Procedure TForm1.CB;
Var
 I, X, Y: Integer;
Begin
  X:= Form1.Width div 2 - 290;
  Y:= Form1.Height div 2 - 180;
 For I:=0 to CountVOtveta -1 do
  Begin
   SB[I]:=TSpeedButton.Create(Self);
    SB[I].Parent:=Form1;
     SB[I].Width:=100;
      SB[I].Height:=80;
      SB[I].Left:=X;
     SB[I].Top:= Y;
    SB[I].Name:='SB' + IntToStr(I);
   SB[I].OnClick:=OnClickSB;
   X:=X + 120;
   IF X = Form1.Width div 2 - 290 + 600 Then
    Begin
     X:=Form1.Width div 2 - 290;
     Y:=Y + 120;
    End;
  End;
End;
Уничтожаю SpeedButton:
Код:
procedure TForm1.DB;
Var
 I: Integer;
begin
  For I:=0 to CountVOtveta -1 do
   Begin
    SB[I].Free;
    SB[I]:=NIL;
   End;
end;
Кликаю на кнопку:
Код:
Procedure TForm1.OnClickSB(Sender: TObject);
Begin
   DB;
   CB;
End;
А суть всей проблемы в том что мне нужно при каждом нажатии на кнопку
Уничтожать и создавать опять кнопки, все работает отлично но есть одно НО после нескольких уничтожений и создания кнопок вылетает ошибка :
QQQQQQQQQQQ.JPG
нажимаю "ОК" и получаю это:
qwwwwwwww.JPG

Как решить эту проблему, подскажите пожалуйста.
Заранее очень благодарен
Я бы изменил мир, но Бог не дает исходников...
Если помог, нажми на весы и поставь плюс - в знак благодарности

Последний раз редактировалось SoftKoc; 11.09.2010 в 16:05.
SoftKoc вне форума Ответить с цитированием
Старый 11.09.2010, 16:05   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Как вариант уберите SB[i]:=nil;
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 11.09.2010, 16:17   #3
SoftKoc
Форумчанин
 
Аватар для SoftKoc
 
Регистрация: 07.11.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от Dj_smart Посмотреть сообщение
Как вариант уберите SB[i]:=nil;
Это не имеет значения, убрал и все тоже самое
Я бы изменил мир, но Бог не дает исходников...
Если помог, нажми на весы и поставь плюс - в знак благодарности
SoftKoc вне форума Ответить с цитированием
Старый 11.09.2010, 16:25   #4
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Ну попробуйте не удалять их, а просто пересчитывать позиции, собственно для чего удаляете?
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 11.09.2010, 16:28   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Хорошо

Лучше так, TObjectList сам очистит память:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs, Buttons, StdCtrls;

type TSpdBtnList = class(TObjectList)
 private
    function GetItems(Index: Integer): TSpeedButton;
    procedure SetItems(Index: Integer; const Value: TSpeedButton);

 public
  property Items[Index: Integer]:TSpeedButton read GetItems write SetItems; default;
 published

end;  

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure CB;
    procedure DB;
    Procedure OnClickSB(Sender: TObject);
    { Public declarations }
  end;

const
 CountVOtveta = 10;  

var
  Form1: TForm1;
  SpdBtnList :TSpdBtnList;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CB;
var
  SB :TSpeedButton;
  I, X, Y :Integer;
begin // создание
  X:= Width div 2 - 290;
  Y:= Height div 2 - 180;
 For I:=0 to CountVOtveta -1 do
  Begin
   SB := TSpeedButton.Create(Self);
   SB.Parent:=Form1;
   SB.Width:=100;
   SB.Height:=80;
   SB.Left:=X;
   SB.Top:= Y;
   SB.Name:='SB' + IntToStr(I);
   SB.Caption := SB.Name;
   SB.OnClick := OnClickSB;
   X := X + 120;
   IF X = (Width div 2 - 290 + 600) Then
    Begin
     X:= Width div 2 - 290;
     Y:=Y + 120;
    End;
   SpdBtnList.Add(SB);
  End;
end;

procedure TForm1.DB;
begin // удаляем всё
 SpdBtnList.Clear;
end;

procedure TForm1.OnClickSB(Sender: TObject);
begin // k
 DB;
 CB;
end;

{ TSpdBtnList }

function TSpdBtnList.GetItems(Index: Integer): TSpeedButton;
begin
 Result := TSpeedButton(inherited GetItem(Index));
end;

procedure TSpdBtnList.SetItems(Index: Integer; const Value: TSpeedButton);
begin
 inherited SetItem(Index, Value);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 SpdBtnList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 CB;
 Button1.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  I :Integer;
begin
 if SpdBtnList.Count > 0 then
 begin
  Randomize;
  For I := SpdBtnList.Count-1 downto 0 do
  begin
   SpdBtnList.Items[I].Caption := Format('№%d', [Random(10)+1]);
  end;  
 end
  else
 ShowMessage('Список кнопок пуст!');  
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 SpdBtnList := TSpdBtnList.Create(True);
end;

end.
Вложения
Тип файла: rar Speedbutton массив(TObjectList).rar (6.6 Кб, 9 просмотров)

Последний раз редактировалось Alter; 11.09.2010 в 16:35.
Alter вне форума Ответить с цитированием
Старый 11.09.2010, 16:46   #6
SoftKoc
Форумчанин
 
Аватар для SoftKoc
 
Регистрация: 07.11.2009
Сообщений: 218
По умолчанию

По мимо этого всего у меня создано 5 динамических массивов, может ли это как-то влиять. Может просто память переполняется или что-то в этом роде?

Код:
Var
  Vopros: array of String;
  VOtveta: array of array of String;
  Otchet: array of array of Integer;
  SB: array of TSpeedButton;
  LB: array of TLabel;
Я бы изменил мир, но Бог не дает исходников...
Если помог, нажми на весы и поставь плюс - в знак благодарности
SoftKoc вне форума Ответить с цитированием
Старый 11.09.2010, 21:05   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может заюзать TObjectList?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.09.2010, 02:43   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
нужно при каждом нажатии на кнопку уничтожать и создавать опять кнопки
О, ужас..... Зачем? о__О


У меня всё приведённое в первом посте прекрасно работает...
Может что-то не то в OnClickSB (которой не показывалось)?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 12.09.2010, 08:03   #9
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

TObjectList решает очень много проблемм при использовании динамических массивов из сложных обьектов... зачем изобретать велосипед, который может дать сбой, если есть готовое решение, которое очень функционально, стабильно и быстро?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 12.09.2010, 12:24   #10
SoftKoc
Форумчанин
 
Аватар для SoftKoc
 
Регистрация: 07.11.2009
Сообщений: 218
Сообщение

Цитата:
Сообщение от DomiNick Посмотреть сообщение
О, ужас..... Зачем? о__О


У меня всё приведённое в первом посте прекрасно работает...
Может что-то не то в OnClickSB (которой не показывалось)?
Может быть, вот ложу исходник. Помогите кто чем может.
>>>>>>ChoiceTest.rar<<<<<<
Там проблема скорее всего в одном из массивов

Два массива "OptionQuestion , Reply" - я создаю вот таким образом.

Код:
SetLength(Reply, 10);
SetLength(Reply[0], 5);
SetLength(Reply[1], 4);
SetLength(Reply[2], 2);
SetLength(Reply[3], 6);
SetLength(Reply[4], 7);
Только я это все делаю в цыкле.
Я бы изменил мир, но Бог не дает исходников...
Если помог, нажми на весы и поставь плюс - в знак благодарности
SoftKoc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив Ueshua Общие вопросы C/C++ 7 28.12.2009 09:45
динамический массив Cpluser Общие вопросы C/C++ 1 20.09.2009 18:17
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2007 23:54
динамический массив Diller Помощь студентам 48 07.10.2007 16:43
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 06:45