Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: Termis
Дата сообщения: 18.11.2012 21:14

Цитата:
Создать 3-ий модуль DataTypes и там объявить ваш массив и использовать его по всей программе

И объявлять переменные в Unit-ах как DataTypes.IntArray?
Автор: Frodo_Torbins
Дата сообщения: 18.11.2012 21:27
Termis
Удалите дубль типа IntArray из первого юнита. Он ведь все равно объявлен в интерфейсной секции второго юнита, значит вы спокойно можете использовать его в первом.
А вообще есть подозрение, что вам не помешает пробежаться взглядом по какому-нибудь справочнику об основах делфи.
Автор: alex1334
Дата сообщения: 18.11.2012 21:32
Termis
Вроде так и должно быть. Повторное определение типа перекроется со своей областью видимости.
Попробуйте объявить Type IntArray = array[0..15] of integer; только в модуле Unit1
обязательно в секции interface а в остальных модулях в секции implementation добавить
строку uses Unit1; Если в секции implementation уже есть строка USES то просто добавьте в конец свой модуль Unit1 через запятую. ( но только при условии что в секции интерфейса модуль не был подключен оператором uses) В качестве Unit1 можете использовать любой модуль вашего проекта а не только тот у которого меньше номер, если так можно сказать
Хочу вас предупредить об одной типичной ошибки. Событие onClick обрабатывается процедурой. Если ваша переменная объявлена внутри этой процедуры то как только процедура завершиться данные на которые указывает переменная ab будут утеряны. И вы уже никогда не сможете к ним обратиться. Даже если где то у вас еще объявлена переменная с именем ab
Автор: Termis
Дата сообщения: 18.11.2012 21:36
В Unit1 просто написал a: Unit2.IntArray;
и все заработало.
Frodo_Torbins, alex1334, salexn1 спасибо
Автор: salexn1
Дата сообщения: 19.11.2012 07:26
Termis
с точки зрения правильности написания, лучше вынести в другой модуль объявление типов.
Если Unit2 со временем разрастется до неприличных размеров - будет не кашерно...
Ради одного типа тянуть весь модуль в проект...
Автор: Termis
Дата сообщения: 19.11.2012 08:27

Цитата:
с точки зрения правильности написания, лучше вынести в другой модуль объявление типов.
Если Unit2 со временем разрастется до неприличных размеров - будет не кашерно...
Ради одного типа тянуть весь модуль в проект...

по большому счету у меня будет много Unit-ов, которые будут использовать одни и те же функции, находящиеся в Unit2 .... а эти пользовательские типы и нужны для этих функций, находящихся в Unit2...
или все равно имеет смысл вынести их в новый файл?
Автор: ant0ni02004
Дата сообщения: 19.11.2012 19:22
Termis
с одной стороны, если всё в unit2 - то при использовании будет Uses Unit2 и всё. Если сделать определения в отдельном модуле - будете по 2 подключать uses Unit2, Unit3.
и всё таки - на чём экономим 2 юнита оно и чище будет, и гибче
Автор: salexn1
Дата сообщения: 19.11.2012 20:53
ant0ni02004
в этом смысле мне нравится идеология c#(. net): каждый класс(enum)-в отдельный модуль.
Автор: Termis
Дата сообщения: 19.11.2012 23:53
Спасибо, вынес все-таки в новый файл - действительно удобнее. Все по полочкам.
Автор: sammozg
Дата сообщения: 20.11.2012 04:32
Ребята, не подскажите, может я чего не догоняю, в общем запускаю прогу в делфи, через несколько циклов работы потока выдаёт ошибку чтения по адресу 00000000, но если я запускаю её-же без делфи ошибки нет, хотел посмотреть где ошибка, он меня выкидывает всё время на дисконект (IdTCPClient), а может мне просто забить на эту ошибку?
Автор: exteris
Дата сообщения: 20.11.2012 07:40

Цитата:
но если я запускаю её-же без делфи ошибки нет

Вы случаем try-except-ом ошибку нигде не душите?
Автор: salexn1
Дата сообщения: 20.11.2012 09:14
sammozg
Можно же логи повтыкать повсюду и найти в чем проблема.

можете на этот логер посмотреть: хттп://log4delphi.sourceforge.net/
или подключить Eurekalog какой нить (так будет даже проще)
Автор: sammozg
Дата сообщения: 20.11.2012 09:57
exteris
Я сначало так-же думал но после того как убрал почти все try-except нечего не изменилось, оставил только
try
Client1.ReadBuffer(buffer[i],lenSav);
except
OshibkaTMP:=OshibkaTMP+1;
end;

salexn1
логами в принципе и можно только код потока здаравенный больно
http://forum.ru-board.com/topic.cgi?forum=33&topic=11215&start=1366&limit=1&m=1#1
Правда этот код претерпел немного изменений
последним было установка Indy10, может в этом проблема?
Автор: salexn1
Дата сообщения: 20.11.2012 10:08
sammozg
заюзайте тогда Eurekalog и посмотрите, что происходит.
Как правило бывает наоборот: под Delphi все работает правильно, а потом падает в реальной жизни...
Автор: snike555
Дата сообщения: 20.11.2012 11:20

Цитата:
заюзайте тогда Eurekalog и посмотрите, что происходит

+1
обязательно настройте отсылку логов себе
Автор: sammozg
Дата сообщения: 20.11.2012 12:07
salexn1
snike555
Я тут немного по другому сделал, через менеджер потоков вышел на поток в котором ошибка и запустил отладчик, в итоге ошибка вылетает в Kernel32.RaiseException
в строчке 7C812AEB POP ESI, а вот теперь что с ней делать понятия не имею, не я же создавал эту процедуру...

Только вспомнил в Embarcadero RAD Studio 2010 выходила подобная ошибка тоже с файлом Kernel32 на компоненте Indy...
Автор: salexn1
Дата сообщения: 20.11.2012 13:55
sammozg

Цитата:
Kernel32.RaiseException

я думаю (точнее уверен), что проблема где-то уровнем выше, т.е. в вашем коде.

Kernel32.RaiseException - это уже последствия
Автор: sammozg
Дата сообщения: 20.11.2012 15:37
Если я правильно понял то этот участок кода Kernel32.RaiseException отвечает за исключительные ситуации??? Если так,тогда наверное стоит убрать все try-except и повторить попытку, найти суть проблемы, я правильно мыслю?
Автор: ant0ni02004
Дата сообщения: 20.11.2012 16:29
sammozg
ну и здоровенный код у вас, сразу и не разберёшься

а поставьте проверки (всюду после lenSav:=......), что lenSav не превышает размер буффера, в который вы считываете потом данные (т.е. 512 байт)
может быть в этом дело, или наоборот - в том, что пытаетесь прочитать больше, чем пришло на самом деле
Автор: salexn1
Дата сообщения: 20.11.2012 22:14
sammozg

Цитата:
убрать все try-except и повторить попытку


Это самая умная мысль...
Только прикрутите EurekaLog
Автор: xliker
Дата сообщения: 28.11.2012 19:38
Здравствуйте. Такая проблема: создал компонент, наследник TStringGrid, в нем есть свойство типа TStringList, в конструкторе оно создается. Оно описано как published, в инспекторе объектов появляется соответствующее свойство. Кидаю компонент на форму, заполняю это свойство, оно вполне себе корректно отображается в моем компоненте, но при запуске программы запускается конструктор моего компонента, и в нем это свойство создается заново, таким образом не отображая информацию, введенную на этапе проектирования. Код с комментариями прилагается. Спасибо.

Код:
TMarkTable = class(TStringGrid)
private
FFio : TStringList;
FMark : TArray;
protected
procedure SetFio(value : TStringList);
procedure SetMark(value : TArray);
function SelectCell(ACol, ARow : Longint) : boolean; override;
procedure DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); override;
public
constructor Create(AOwner : TComponent); override;
procedure MoveData();
destructor Destroy(); override;
published
property Fio : TStringList read FFio write SetFio; //вот это свойство
property Mark : TArray read FMark write SetMark;
end;

constructor TMarkTable.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FFio := TStringList.Create; //конструктор при запуске программы этой командой создает новый TStringList, не сохраняя мой
FMark := TArray.Create;
ColCount := 2;
RowCount := 2;
FixedCols := 0;
FixedRows := 1;
Cells[0,0] := 'Фамилия';
Cells[1,0] := 'Балл';
end;
Автор: salexn1
Дата сообщения: 28.11.2012 21:33
xliker
Я думаю, что SetFio у вас вот такое вот:

procedure TMarkTable.SetFio(const Value: TStringList);
begin
FFio := Value;
end;

а должно быть

procedure TMarkTable.SetFio(const Value: TStringList);
begin
FFio.Assign(Value);
end;

и будет все ок
Автор: xliker
Дата сообщения: 29.11.2012 17:57
salexn1, нет, как раз через Assign делал, вот как:

Код:
procedure TMarkTable.SetFio(value : TStringList);
begin
FFio.Assign(value);
MoveData;
end;

procedure TMarkTable.MoveData();
var
i : integer;
begin
RowCount := Max(Fio.Count, Mark.Size) + 1;
for i:=0 to FFio.Count-1 do
Cells[0,i+1] := Fio.Strings[i];
for i:=0 to FMark.Size-1 do
Cells[1,i+1] := IntToStr(Mark.GetValue(i));
end;
Автор: salexn1
Дата сообщения: 29.11.2012 20:39
xliker
Конструктор тут не при чем.
Выложите весь код, что ли...
Автор: xliker
Дата сообщения: 30.11.2012 10:14
salexn1, подсказали проверить файл формы (.dfm). Там вместо введенных мной значений вот такое:

Код:
//...
Fio.Strings = (
#1055#1077#1088#1074#1099#1081
#1042#1090#1086#1088#1086#1081)
//...
Автор: salexn1
Дата сообщения: 30.11.2012 10:35
xliker
Это и есть ваши значения, только в UTF (вроде как)
Автор: ant0ni02004
Дата сообщения: 30.11.2012 18:39
xliker
поскольку вы не показываете весь код - остаётся только гадать что и где там у вас происходит... а вдруг вы просто еще раз в коде руками создаёте свой TMarkTable и т.о. он перезаписывает тот, который из dfm загрузился
Автор: xliker
Дата сообщения: 30.11.2012 21:57
Вот класс компонента:

Код:
type
TArray = class
private
FMark : array[0..19] of integer;
FCount : integer;
FSize : integer;
public
constructor Create;
procedure SetValue(ind, value : integer);
function GetValue(ind : integer) : integer;
procedure SetArray(a : TArray);
procedure Clear;
procedure Add(a : integer);
property Count : integer read FCount write FCount;
property Size : integer read FSize write FSize;
end;


TMarkTable = class(TStringGrid)
private
FFio : TStrings;
FMark : TArray;
protected
procedure SetFio(value : TStrings);
procedure SetMark(value : TArray);
function SelectCell(ACol, ARow : Longint) : boolean; override;
procedure DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); override;
public
constructor Create(AOwner : TComponent); override;
procedure MoveData();
destructor Destroy(); override;
published
property Fio : TStrings read FFio write SetFio stored True;
property Mark : TArray read FMark write SetMark;
end;

procedure Register;

implementation

uses Math;

procedure Register;
begin
RegisterComponents('Samples', [TMarkTable]);
end;

constructor TMarkTable.Create(AOwner : TComponent);
begin
FFio := TStringList.Create;
FMark := TArray.Create;
inherited Create(AOwner);
ColCount := 2;
RowCount := 2;
FixedCols := 0;
FixedRows := 1;
Cells[0,0] := 'Ôàìèëèÿ';
Cells[1,0] := 'Áàëë';
end;

destructor TMarkTable.Destroy();
begin
FFio.Free;
FMark.Free;
inherited Destroy;
end;

procedure TMarkTable.SetMark(value : TArray);
begin
FMark.SetArray(value);
end;

procedure TMarkTable.SetFio(value : TStrings);
begin
FFio.Assign(value);
MoveData;
end;

procedure TMarkTable.MoveData();
var
i : integer;
begin
RowCount := Max(Fio.Count, Mark.Size) + 1;
for i:=0 to FFio.Count-1 do
Cells[0,i+1] := Fio.Strings[i];
for i:=0 to FMark.Size-1 do
Cells[1,i+1] := IntToStr(Mark.GetValue(i));
end;

constructor TArray.Create;
begin
inherited Create;
Count := 20;
Size := 0;
end;

procedure TArray.SetValue(ind, value : integer);
begin
FMark[ind] := value;
end;

function TArray.GetValue(ind : integer) : integer;
begin
result := FMark[ind];
end;

procedure TArray.Clear;
begin
FSize := 0;
end;

procedure TArray.Add(a : integer);
begin
FMark[FSize] := a;
inc(FSize);
end;

procedure TArray.SetArray(a : TArray);
var
i : integer;
begin
Clear;
for i := 0 to a.FSize - 1 do
Add(a.GetValue(i));
end;

function TMarkTable.SelectCell(ACol, ARow : Longint) : boolean;
begin
InvalidateGrid;
result := true;
end;

procedure TMarkTable.DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
inherited;
if gdFocused in State then
begin
Canvas.Font.Color := RGB(238,43,67);
Canvas.Font.Style := [fsBold];
Canvas.Brush.Color := RGB(223,185,133);
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, AnsiUpperCase(Cells[ACol,ARow]));
end
else
if not (gdFixed in State) then
begin
Canvas.Font.Color := clBlack;
Canvas.Font.Style := [];
Canvas.Brush.Color := clWhite;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, AnsiLowerCase(Cells[ACol,ARow]));
end
end;

end.
Автор: ant0ni02004
Дата сообщения: 30.11.2012 22:42
xliker
код как будто ок, имелся в виду еще и код формы. не создаётся ли там вручную где-нибудь что-то поверх того что есть, типа mt := TMarkTable.Create(....)
Автор: xliker
Дата сообщения: 30.11.2012 23:20
ant0ni02004, форму пустую создаю и кидаю на нее компонент из палитры, юнит вообще пустой, разве что MarkTable1 : TMarkTable;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.