Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 83 из 116<  1 ... 80  81  82  83  84  85  86 ... 116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Zеrg
По одному и panel и edit и даже label :) убиваются.
Zеrg писал(а):
Если отработает, значит в цикле проблема

При i:=1 проходит, на втором шаге вываливается "Invalid pointer operation"



Партнер
 

Member
Статус: Не в сети
Регистрация: 03.01.2003
Откуда: Ростов-на-Дону
Код:
For i:=0 to QCount-1

_________________
Just Zerg! Остановим деградацию русского языка, скажем нет удафкомовской лексике!!


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Xupyp1
Ты делал i:=1 to Qcount?! :lol:

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Zеrg Максим
Может объясните чуть подробнее?

Вот кстати объявление массивов:
Код:
QArray:array[1..20] of TPanel;
LabelArray:array[1..20] of TLabel;
EditArray:array[1..20] of TEdit;


 

Member
Статус: Не в сети
Регистрация: 03.01.2003
Откуда: Ростов-на-Дону
Xupyp1 Ну что я могу тебе сказать :) Учиться, учиться и ещё раз учиться ...

_________________
Just Zerg! Остановим деградацию русского языка, скажем нет удафкомовской лексике!!


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Xupyp1
НУ тогда нормально. Просто тут как бы многие или еще и Си пользуются, или пользуются динамическими массивами. И из-за этого счетчики начинаются с нуля.
Кстати писать вот так тоже не есть хороший тон.
Код:
Const
   MaxCount = 20;
Var
  QArray:array of TPanel;
  LabelArray:array of TLabel;
  EditArray:array of TEdit;   
  I: Integer;
  my_obj: PObject;
Begin
  SetLength(QArray, MaxCount);
  SetLength(LabelArray, MaxCount);
  SetLength(EditArray, MaxCount);

  //тут твоя работа такая же как и в том массиве, просто можешь смотреть на MaxCount или на Length(QArray) например
  ....
  //а потом можешь сделать так
  For I := Low(QArray) To High(QArray) Do
  Begin
     If Assigned(QArray[I]) Then
     Begin
         my_obj := (QArray[i] as TPanel).ClassInfo;
         FreeAndNil(my_obj);   
     End;
  End;
  //подчистим сам массив
  SetLength(QArray, 0);
  SetLength(LabelArray, 0);
  SetLength(EditArray, 0);
End;

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Zеrg
Дык учимся :)
Не делает ошибки лишь тот, кто вообще ничего не делает ;)

Я так понял, конструкция:
Код:
if QCount>0 then
  begin
    For i:=1 to QCount do
      begin
        QArray[i].Free;
        EditArray[i].Free;
        LabelArray[i].Free;
      end;
  end;

некорректна, да?

А как будет правильно?
Я вот попробовал массивы пронумеровать с "0"
и еще использовал "For i:=0 to QCount-1"
Результат я думаю понятен. Ничего не вышло :(

Помогите, народ! :beer:
Добавлено спустя 7 минут, 46 секунд
Максим
Сделал как ты написал - "Access violation".


 

Member
Статус: Не в сети
Регистрация: 03.01.2003
Откуда: Ростов-на-Дону
Xupyp1

Значит у тебя Delphi какае-то корявое, только что у себя компилировал код, предоставленный Максим, всё отлично работает.

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
   MaxCount = 20;
var
  LabelArray:array of TLabel;
  EditArray:array of TEdit;
  I: Integer;
  my_obj: PObject;
begin
  SetLength(LabelArray, MaxCount);
  SetLength(EditArray, MaxCount);
  for I := Low(LabelArray) to High(LabelArray) do
  begin
     if Assigned(LabelArray[I]) then
     begin
         my_obj := (LabelArray[i] as TLabel).ClassInfo;
         FreeAndNil(my_obj);
     end;
  end;
  SetLength(LabelArray, 0);
  SetLength(EditArray, 0);
end;


У меня BDS2006

_________________
Just Zerg! Остановим деградацию русского языка, скажем нет удафкомовской лексике!!


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Zеrg
Секундочку. А что тут у тебя не написано, что ты эти объекты создаешь?! Конечно работать будет, так как везде записано nil :)
Добавлено спустя 8 минут, 1 секунду
Xupyp1
Твоя конструкция нормальна, просто все-таки надо каждый раз проверять с помощью Assigned(объект). Чтоб поменьше наталкиваться на Access Violation

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Максим
Сейчас этот сегмент кода выглядит так:
Код:
if QCount>0 then
  begin
    ShowMessage('Have found '+IntToStr(QCount)+' components');
    For i:= Low(QArray) To High(QArray)-1 Do
      begin
        if Assigned(QArray[i]) then
          begin
            my_obj := QArray[i].ClassInfo;
            FreeAndNil(my_obj);
          end;

        if Assigned(EditArray[i]) then
          begin
            my_obj := EditArray[i].ClassInfo;
            FreeAndNil(my_obj);
          end;

        if Assigned(LabelArray[i]) then
          begin
            my_obj := LabelArray[i].ClassInfo;
            FreeAndNil(my_obj);
          end;
      end;
    SetLength(QArray, 0);
    SetLength(LabelArray, 0);
    SetLength(EditArray, 0);
  end;

Хотя, какая разница? Все равно не работает :bandhead: :(


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Xupyp1
А дебаг на чем сваливается?

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Максим
"Access violation" :)
Среда программирования - BDS 2006 Update 2
Добавлено спустя 3 минуты, 13 секунд
Сваливается на строке:
Код:
FreeAndNil(my_obj);

точнее:
Код:
Obj^ := nil;


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Xupyp1
Xupyp1 писал(а):
Вот я создаю компоненты во время выполнения программы:

Не понял, к чему такие сложности в коде. :)
все делается легко, при этом и работает и освобождается нормально.
Xupyp1 писал(а):
"Access violation" :)

гы... :)


 

Member
Статус: Не в сети
Регистрация: 18.01.2004
Фото: 0
Xupyp1
ClassInfo возвращает указатель на RTTI класса и делать ему Free нельзя. Делай так

For i:= Low(QArray) To High(QArray) Do
begin
FreeAndNil(QArray[i]);
FreeAndNil(EditArray[i]);
FreeAndNil(LabelArray[i]);
end;

или

For i:= Low(QArray) To High(QArray) Do
begin
QArray[i].Free;
EditArray[i].Free;
LabelArray[i].Free;
end;

_________________
Да гоните вы все!


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
_SGK
_SGK писал(а):
Не понял, к чему такие сложности в коде

Есть более простой способ?

Я ведь не от хорошей жизни создаю компоненты во время работы приложения.
Как иначе реализовать то, что мне надо?

Вот что мне надо:
#77
#77
Это простенький тест :oops:


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Xupyp1
Xupyp1 писал(а):
Есть более простой способ?

Есть варианты :), если же делать так, как ты - с использованием массивов, то можно так.
Особо не умничал :haha: - в процедуре _Create создается, в _Free соответственно освобождается.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    btnCreate: TButton;
    btnFree: TButton;
    procedure btnFreeClick(Sender: TObject);
    procedure btnCreateClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    b: boolean;
    aPnl: array of TPanel; aLbl: array of TLabel; aEdt: array of TEdit;
    procedure _Create(aOwner: TWinControl; pnlTop, pnlLeft, pnlWidth, pnlHeight: integer; Captions: TStrings);
    procedure _Free;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1._Create(aOwner: TWinControl; pnlTop, pnlLeft, pnlWidth, pnlHeight: integer; Captions: TStrings);
var
  i: Integer;
begin
  if b then
    _Free;
  SetLength(aPnl, Captions.Count); SetLength(aLbl, Captions.Count); SetLength(aEdt, Captions.Count);
  for i:= Low(aPnl) to High(aPnl) do
  begin
    aPnl[i]:= TPanel.Create(aOwner);
    aPnl[i].Top:= pnlTop;
    aPnl[i].Left:= pnlLeft;
    aPnl[i].Width:= pnlWidth;
    aPnl[i].Height:= pnlHeight;
    aPnl[i].Parent:= aOwner;
    aLbl[i]:= TLabel.Create(aPnl[i]);
    aLbl[i].Top:= 8;
    aLbl[i].Left:= 8;
    aLbl[i].Caption:= Captions.Strings[i];
    aLbl[i].Parent:= (aPnl[i]);
    aEdt[i]:= TEdit.Create(aPnl[i]);
    aEdt[i].Top:= aLbl[i].Top + aLbl[i].Height;
    aEdt[i].Left:= aLbl[i].Left;
    aEdt[i].Width:= aPnl[i].Width - aLbl[i].Left * 2;
    aEdt[i].Tag:= i; // Для обработчиков событий, если будут добавлены.
    aEdt[i].Parent:= aPnl[i];
    pnlTop:= pnlTop + pnlHeight;
  end;
  b:= true;
end;

procedure TForm1._Free;
var
  i: Integer;
begin
  for i:= Low(aPnl) to High(aPnl) do
  begin
    aLbl[i].Free; aEdt[i].Free; aPnl[i].Free;
  end;
  SetLength(aLbl, 0); SetLength(aEdt, 0); SetLength(aPnl, 0); b:= false;
end;

procedure TForm1.btnCreateClick(Sender: TObject);
var
  SL: TStringList;
begin
  SL:= TStringList.Create;
  try
    SL.Add('Вопрос 1: бла-бла-бла...');
    SL.Add('Вопрос 2: бла-бла-бла...');
    SL.Add('Вопрос 3: бла-бла-бла...');
    _Create(Form1, 8, 8, 460, 57, SL);
  finally
    SL.Free;
  end;
end;

procedure TForm1.btnFreeClick(Sender: TObject);
begin
  _Free;
end;

end.

В случае необходимости aOwner для _Create, можно изменить на нужный, в твоем случае на TabSheet1
Пример:
Код:
 _Create(Form1.TabSheet1, 8, 8, 460, 57, SL);

подправил _Create :)


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
_SGK
Все работает просто прекрастно!
Огромное спасибо! :beer:

Народ
Кто-нить знает более продвиную замену RichEdit?
Ну, чтобы больше форматов документов понимал и т.п. :)
Еще в RichEdit как-то странно переносы расставляются. Не совсем оптимально.
Добавлено спустя 58 секунд
_SGK писал(а):
В случае необходимости aOwner для _Create, можно изменить на нужный, в твоем случае на TabSheet1

Да ладно тебе :) Я ведь не настолько зелен... или ...?


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Xupyp1
Xupyp1 писал(а):
Да ладно тебе Я ведь не настолько зелен... или ...?

Да не :), просто прокомментировал, без "задних" мыслей. :)


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
А есть ли код, который добавляет имя автора и краткое описание к откомпиллированному ехе-шнику? Имеется ввиду что-то типа такого описания (см. скрин), которое выскакивает, когда наводишь курсор на ехе-шник.
#77
P. S. Скрин привёл просто для примера. То, что этот ехе-шник упакован NSIS'ом (а не откомпиллирован в Delphi) я прекрасно понимаю. Но интересует, есть ли такая возможность в Делфи 7?


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Shader 3.0
Shader 3.0 писал(а):
Имеется ввиду что-то типа такого описания

Угу :), через меню добавляешь: Project -> Options… -> Version Info. ;)


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 83 из 116<  1 ... 80  81  82  83  84  85  86 ... 116  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan