![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Имеется массив beforelbl
Длина массива 0. Код:
showmessage('High(beforelbl)='+inttostr(High(beforelbl)));
for i := 0 to High(beforelbl) do
begin
showmessage('for i := 0 to High(beforelbl) do');
endshowmessage до цикла выдаёт значение "-1", а второй showmessage всё равно показывает, то есть несмотря на то, что 0<-1 цикл всё равно выполняется... в чём дело??? Я же не ставил downto -1 |
|
#2
|
||||
|
||||
|
Код:
for i:=Low(beforelbl) to High(beforelbl) do Последний раз редактировалось NumLock, 22.10.2012 в 13:54. |
|
#3
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
beforelbl: array of Integer;
i: Integer;
begin
showmessage('High(beforelbl)=' + inttostr(High(beforelbl)));
for i := 0 to High(beforelbl) do
begin
showmessage('for i := 0 to High(beforelbl) do');
end
end; |
|
#4
|
||||
|
||||
|
У меня вот такой код:
Код:
var
i:Integer;
beforelbl:array of Integer;
begin
showmessage('High(beforelbl)='+inttostr(High(beforelbl)));
for i := 0 to High(beforelbl) do
begin
showmessage('for i := 0 to High(beforelbl) do');
end
end;Последний раз редактировалось Aristarh Dark, 22.10.2012 в 13:56. |
|
#5
|
|||
|
|||
|
в том-то и дело, что дело странное, у меня два сообщения, переходит в тело цикла...
![]() |
|
#6
|
||||
|
||||
|
Цитата:
Входит в тело цикла? p.s. Какая у тебя версия Delphi? |
|
#7
|
||||
|
||||
|
создай пустой проект и добавь кнопку на форму:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
beforelbl: array of Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
// SetLength(beforelbl, 4);
ShowMessage(IntToStr(Low(beforelbl)));
ShowMessage(IntToStr(High(beforelbl)));
for i:=Low(beforelbl) to High(beforelbl) do ShowMessage('>>'+IntToStr(i));
end;
end. |
|
#8
|
|||
|
|||
|
Delphi 7.0 Build 4.453
если просто так - работает, а в моей проге не хочет.. не пойму в чём дело... массив создаётся уже в этом же цикле, а размер массива ранее... мсожет быть пока значения в массив не попали, то его размер как-то... хз... не знаю что думать даже... |
|
#9
|
||||
|
||||
|
Цитата:
Как объявлен массив? И как задаётся его размер? |
|
#10
|
|||
|
|||
|
Код:
unit UChangesMsg;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg, ComCtrls, UDataModule;
type
TFChangesMsg = class(TForm)
YesButton: TButton;
NoButton: TButton;
ActionLbl: TLabel;
ApplyImage: TImage;
CancelImage: TImage;
ChangesImage: TImage;
procedure ShowBox(titles, before, after: string);
procedure YesButtonClick(Sender: TObject);
procedure NoButtonClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
//Запрет перемещения формы
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;
function ChangesMsg(titles, before, after:string):BOOL;
var
FChangesMsg: TFChangesMsg;
titleslbl, beforelbl, afterlbl: array of TLabel;
titles_, before_, after_: TStringList;
implementation
{$R *.dfm}
procedure TFChangesMsg.WMNCHitTest(var Message: TWMNCHitTest);
begin
inherited;
with Message do
if Result = HTCAPTION then
Result := HTCLIENT;
end;
function ChangesMsg(titles, before,after:string):BOOL;
begin
try
FChangesMsg.ShowBox(titles, before, after);
finally
if FChangesMsg.ActionLbl.Caption = 'Yes' then Result:=True;
if FChangesMsg.ActionLbl.Caption = 'No' then Result:=False;
end;
end;
{----- Процедура вызова сообщения -----}
procedure TFChangesMsg.ShowBox(titles, before, after: string);
var
Pos: Integer;
i, h, maxcount, maxh, fontsize, txtheight, betweenrows: cardinal;
begin
fontsize:=12;
betweenrows:=3;
Application.CreateForm(TFChangesMsg, FChangesMsg);
with FChangesMsg do
begin
YesButton.Show;
NoButton.Show;
ApplyImage.Show;
CancelImage.Show;
//делаем TStringList массивы значений
titles_:= TStringList.Create();
before_:= TStringList.Create();
after_:= TStringList.Create();
StrBreakApart(titles, '<BR>', titles_);
StrBreakApart(before, '<BR>', before_);
StrBreakApart(after, '<BR>', after_);
//Устанавливаем размеры массивов
try SetLength(titleslbl, titles_.Count) except showmessage('Ошибка: не удаётся установить размер массива titles') end;
try SetLength(beforelbl, before_.Count) except showmessage('Ошибка: не удаётся установить размер массива before') end;
try SetLength(afterlbl, after_.Count) except showmessage('Ошибка: не удаётся установить размер массива after') end;
if titles<>'' then
begin
//создаём видимый первый столбец Label для каждого значения
for i := 0 to High(titleslbl) do
begin
titleslbl[i] := TLabel.Create(FChangesMsg);
titleslbl[i].Parent := FChangesMsg;
titleslbl[i].Font.Color := clBlack;
titleslbl[i].Font.Size:=fontsize;
txtheight:=titleslbl[i].Height;
//Если значения before и after отличаются - выделяем красным
try
if before_[i]<>after_[i] then titleslbl[i].Font.Color := clRed;
except end;
titleslbl[i].Top := 8 + i * (txtheight + betweenrows);
titleslbl[i].Left := 8;
titleslbl[i].Caption := titles_[i];
end;
end;
//Увеличиваем окно, чтобы корректно рассчитались размеры canvas
maxcount:=titles_.Count;
maxh := 8 + maxcount * (txtheight + betweenrows)+14;
Height:= maxh + 80;
Width:=2000;
if before<>'' then
begin
//Увеличиваем окно, чтобы корректно рассчитались размеры canvas
if before_.Count>maxcount then
begin
maxcount:=before_.Count;
maxh := 8 + maxcount * (txtheight + betweenrows)+14;
Height:= maxh + 80;
end;
//создаём невидимый второй столбец Label для каждого значения
for i := 0 to High(beforelbl) do
begin
beforelbl[i] := TLabel.Create(FChangesMsg);
beforelbl[i].Parent := FChangesMsg;
beforelbl[i].Font.Color := clBlack;
beforelbl[i].Font.Size:=fontsize;
//Если значения before и after отличаются - выделяем красным
try
if before_[i]<>after_[i] then beforelbl[i].Font.Color := clRed;
except end;
beforelbl[i].Top := 8 + i * (txtheight + betweenrows);
beforelbl[i].Left := 8;
beforelbl[i].Caption := before_[i];
end;
end;
if after<>'' then
begin
//Увеличиваем окно, чтобы корректно рассчитались размеры canvas
if after_.Count>maxcount then
begin
maxcount:=after_.Count;
maxh := 8 + maxcount * (txtheight + betweenrows)+14;
Height:= maxh + 80;
end;
//создаём невидимый третий столбец Label для каждого значения
for i := 0 to High(afterlbl) do
begin
afterlbl[i] := TLabel.Create(Self);
afterlbl[i].Parent := FChangesMsg;
afterlbl[i].Font.Color := clBlack;
afterlbl[i].Font.Size:=fontsize;
//Если значения before и after отличаются - выделяем красным
try
if before_[i]<>after_[i] then afterlbl[i].Font.Color := clRed;
except end;
afterlbl[i].Top := 8 + i * (txtheight + betweenrows);
afterlbl[i].Caption := after_[i];
afterlbl[i].Visible := false;
end;
end;
//Освобождаем массивы за ненадобностью - теперь всё хранится в массиве TLabel
titles_.Free();
before_.Free();
after_.Free();
// Присваиваем заголовок
If (before='') and (after<>'') then Caption := 'Добавить?';
If (before<>'') and (after<>'') then
begin
Caption := 'Изменить?';
ChangesImage.Visible := True;
end;
If (before<>'') and (after='') then Caption := 'Удалить?';
// Оптимизация размеров окна сообщения
ChangesImage.Top := trunc(maxh / 2)-7;
Pos := ClientHeight - 33;
YesButton.Top := Pos;
NoButton.Top := Pos;
ApplyImage.Top:=Pos;
CancelImage.Top:=Pos;
ShowModal;
end;
end;
procedure TFChangesMsg.FormActivate(Sender: TObject);
var
width, maxwidth, fullwidth: cardinal;
i: cardinal;
begin
//Определяем ширины текста первого столбца
width := 0;
maxwidth := 0;
if High(titleslbl)>-1 then
begin
for i := 0 to High(titleslbl) do
begin
//определяем ширину текущего текста
width := titleslbl[i].Canvas.TextWidth(titleslbl[i].Caption);
//запоминаем максимальную ширину
if width > maxwidth then maxwidth := width;
end;
fullwidth:=8+maxwidth;
end;
if High(beforelbl)>-1 then
begin
for i := 0 to High(beforelbl) do
begin
beforelbl[i].Left := fullwidth+8;
beforelbl[i].Visible := true;
//определяем ширину текущего текста
width := beforelbl[i].Canvas.TextWidth(beforelbl[i].Caption);
//запоминаем максимальную ширину
if width > maxwidth then maxwidth := width;
end;
fullwidth:=fullwidth+8+maxwidth;
end;
if High(afterlbl)>-1 then
begin
if length(afterlbl)<>0 then
begin
width := 0;
maxwidth := 0;
for i := 0 to High(afterlbl) do
begin
ChangesImage.Left := fullwidth+8;
afterlbl[i].Left := fullwidth +8+25+ 8;
afterlbl[i].Visible := true;
//определяем ширину текущего текста
width := afterlbl[i].Canvas.TextWidth(afterlbl[i].Caption);
//запоминаем максимальную ширину
if width > maxwidth then maxwidth := width;
end;
fullwidth:=fullwidth+8+25+8+maxwidth;
end;
end;
if fullwidth<272 then fullwidth:=272;
NoButton.Left := fullwidth+8-90;
CancelImage.Left:=fullwidth+8-120;
FChangesMsg.Width:=fullwidth+16;
Position:=poDesktopCenter;
end;
procedure TFChangesMsg.YesButtonClick(Sender: TObject);
begin
Close;
ActionLbl.Caption := 'Yes';
end;
procedure TFChangesMsg.NoButtonClick(Sender: TObject);
begin
Close;
ActionLbl.Caption := 'No';
end;
procedure TFChangesMsg.FormShow(Sender: TObject);
begin
try Self.Icon.LoadFromFile(GetCurrentDir+'\icons\tpm.ico') except showmessage('Не найдена иконка tpm.ico') end;
try ChangesImage.Picture.LoadFromFile(GetCurrentDir+'\icons\arrrght.ico') except showmessage('Не найдена иконка arrrght.ico') end;
try ApplyImage.Picture.LoadFromFile(GetCurrentDir+'\icons\apply.ico') except showmessage('Не найдена иконка apply.ico') end;
try CancelImage.Picture.LoadFromFile(GetCurrentDir+'\icons\close.ico') except showmessage('Не найдена иконка close.ico') end;
end;
end. |
|
#11
|
||||
|
||||
|
А как должно быть правильно?
|
|
#12
|
||||
|
||||
|
Потестировал модуль UChangesMsg - глюков не заметил...
При каких условиях возникает глюк? |
|
#13
|
|||
|
|||
|
думаю, цикл от 0 до -1 с заданием его в виде:
Код:
for i:=0 to -1 do надо записывать его так: Код:
for i:=0 downto -1 do так и не разобрался где ошибка, или не ошибка. в коде выше обошёл просто дополнительным условием |
|
#14
|
|||
|
|||
|
Цитата:
Код:
if High(afterlbl)>-1 then begin |
|
#15
|
||||
|
||||
|
Цитата:
Цитата:
Код:
var width, maxwidth, fullwidth: cardinal; i: cardinal; Итого вместо: Код:
for i:=0 to -1 do Код:
for i:=0 to 4294967295 do |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
sorockinalex (22.10.2012)
| ||