![]() |
|
|
Регистрация | << Правила форума >> | 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'); end showmessage до цикла выдаёт значение "-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
|
||||
|
||||
![]() А как должно быть правильно?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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)
|