![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разное исполенение кода при дебаге и при простом запуске [D7, WinXP]
lockheed_man © (2006-11-09 16:47:00)Ув. Мастера, есть такой код
if GazetaOpened{булева функция} then
begin
CloseTabs;//процедура
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i])
end
else for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i]);
Когда исполняю его по F8, то все выполняется правиль, когда просто запускаю по F9, то независимо от того, выполняется услови или нет, исполняется код записанный перед Else. От чего это может зависеть? Заранее спасибо.
lockheed_man (2006-11-10 13:59:00) [1]
> если хочешь еще критику то
> > 'Не открыта ни одна страница' будет аналогом: русский
> речь меня покинул ;)
>
И сразу же свой вариант, плз.
Rouse_ (2006-11-10 11:26:00) [2]если хочешь еще критику то
> 'Не открыта ни одна страница'будет аналогом: русский речь меня покинул ;)
lockheed_man (2006-11-10 08:34:00) [3]Всем спасибо. Причину нашел. > как минимум 99,99%- чистая правда. Неправильно связал пункт меню и кнопку, связанную с этим пунктом. Как результат - процедура выполнялась дважды.
Всем большое спасибо за советы и критику.
Loginov Dmitry (2006-11-10 07:56:00) [4]Dmitrij_K (09.11.06 16:48) [2]
в 99,9% это ошибка в программе
как минимум 99,99%
^)
ЮЮ (2006-11-10 05:33:00) [5]
> Когда исполняю его по F8, то все выполняется правиль, когда
> просто запускаю по F9, то независимо от того, выполняется
> услови или нет, исполняется код записанный перед Else. От
> чего это может зависеть? Заранее спасибо.
>
Откуда возникло вообще такое предположение, если по обеим веткам делается одно и то же. И вообще GazetaOpened и это ветка ни к чему. Почему не просто
CloseTabs; //убить закладки, если есть
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do
CreateTab(i,PageNumbers[i]) //создать закладки
Кстати, лучше цикл делать не до GetGazetaQueryG_PAGECOUNT.Value - 1, а до High(PageNumbers), ибо твой код не гарантирует их равенство, а при отключеном 'Range Checking' - источник проблем
lockheed_man (2006-11-10 04:36:00) [6]
> По приведённому в [20] коду всё нормально. Но на "глюк компиллятора"
> по прежнему не расчитывай.
>
Получается, что без вариантов. Да уж, голяк. В любом случае спасибо за терпение и комментарии.
Германн (2006-11-10 02:59:00) [7]По приведённому в [20] коду всё нормально. Но на "глюк компиллятора" по прежнему не расчитывай.
lockheed_man (2006-11-10 02:04:00) [8]Вот полный вариант модуля:
var
MainForm: TMainForm;
CurrentUser: String = 'VoVa';
isAdmin: Boolean = True;
IsGazetaOpened: Boolean = False;
GazetaNumber: Word;
ColorPages: array of TColorPage;
PageNumbers: array of Byte;
implementation
uses ULogin, UUsers, UGazetaNumber;
{$R *.dfm}
procedure TMainForm.AddEditBlockBtnClick(Sender: TObject);
var
newBlock: TBlock;
vContainer: TWinControl;
begin
if not IsGazetaOpened then
begin
ShowMessage('Невозможно добавить блок.'+#13+#10+'Не открыта ни одна страница');
Exit;
end;
//prepare block
newBlock := TBlock.Create;
with newBlock do
begin
SetAgent(CurrentUser);
SetFirma(FirmaEdit.Text);
SetPhone(PhoneEdit.Text);
SetPrepaied(PrepaiedEdit.Text);
case BlockSize.ItemIndex of
0: SetBlockSize(30);
1: SetBlockSize(60);
2: SetBlockSize(90);
3: SetBlockSize(120);
end;
case Orientation.ItemIndex of
0: SetOrientation(1); //horizontal
1: SetOrientation(0); //vertical
end;
SetText(BlockText.Text);
SetPageNumber(PageNumbers[PageControl.ActivePageIndex]);
end;
with ColorPages[PageControl.ActivePageIndex] do
begin
AddBlock(newBlock);
DrawBlock(newBlock);
end;
end;
procedure TMainForm.CloseTabs;
var
i: Byte;
begin
for i := 0 to PageControl.PageCount - 1 do
begin
PageControl.ActivePage.Free;
//ColorPages[i].Free;
end;
IsGazetaOpened := False;
end;
procedure TMainForm.CreateTab(TabNumber, PageNumber: Byte);
var
vSheet: TTabSheet;
begin
{create page tab}
vSheet := TTabSheet.Create(Self);
with vSheet do
begin
PageControl := MainForm.PageControl;
PageIndex := TabNumber;
Caption := 'Страница ' + IntToStr(PageNumber);
Show;
end;
ColorPages[TabNumber] := TColorPage.Create(PageNumber, GetBlocksQuery.RecordCount, vSheet);
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GetBlocksQuery.Close;
GetGazetaQuery.Close;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
if isAdmin then mAdmin.Enabled := True;
StatusBar.Panels[1].Text := 'Пользователь: ' + UpperCase(CurrentUser);
end;
procedure TMainForm.GetPageNumbers(Pages: String);
var
strLength: Byte;
i, j: Byte;
strPage: String;
begin
strLength := Length(Pages);
strPage := '';
j := 0;
SetLength(PageNumbers, GetGazetaQueryG_PAGECOUNT.Value);
for i := 1 to strLength + 1 do
begin
if (Pages[i] <> ',') and (Pages[i] <> #0) then strPage := strPage + Pages[i]
else begin
PageNumbers[j] := StrToInt(strPage);
Inc(j);
strPage := '';
end;
end;
end;
procedure TMainForm.HideBtnClick(Sender: TObject);
begin
BlockInfo.Visible := False;
end;
procedure TMainForm.mAddNewBlockClick(Sender: TObject);
begin
BlockInfo.Visible := True;
end;
procedure TMainForm.mExitClick(Sender: TObject);
begin
Close;
end;
procedure TMainForm.mUsersClick(Sender: TObject);
begin
Application.CreateForm(TUsersForm, UsersForm);
Application.Run;
end;
procedure TMainForm.ToolButton2Click(Sender: TObject);
var
i: Byte;
begin
with GetGazetaQuery do
begin
ParamByName('G_NUMBER').Value := 1;
Open;
end;
GetPageNumbers(GetGazetaQueryG_PAGENUMBERS.Value);
SetLength(ColorPages,GetGazetaQueryG_PAGECOUNT.Value);
with GetBlocksQuery do
begin
ParamByName('G_ID').Value := GetGazetaQueryG_ID.Value;
Open;
end;
if IsGazetaOpened then CloseTabs;
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i]);
IsGazetaOpened := True;
end;
end.
Германн (2006-11-10 01:59:00) [9]Не нашел в коде ни одного места, где переменной IsGazetaOpened присваивается True, кроме procedure TMainForm.ToolButton2Click. Но в ней всё чисто, вроде бы. Нет ли у тебя ещё кода, который ты не привёл?
На "глюк компиллятора" пока не стоит упирать.
lockheed_man (2006-11-10 01:44:00) [10]
> Дал новый код, давай теперь новый вопрос.
Забрал только else, не нужно его там было, но от этого ничего не изменилось.Проблема осталась, процедура CloseTabs выполняется в любом случае.А есть хоть какие-нибудь предположения почему такое может происходить?Может глюк компилятора,а?
Германн (2006-11-10 00:13:00) [11]Дал новый код, давай теперь новый вопрос.
lockheed_man (2006-11-09 20:21:00) [12]Как говорится: "Код в студию"
...
var
MainForm: TMainForm;
CurrentUser: String = 'VoVa';
isAdmin: Boolean = True;
IsGazetaOpened: Boolean = False;
GazetaNumber: Word;
ColorPages: array of TColorPage;
PageNumbers: array of Byte;
implementation
uses ULogin, UUsers, UGazetaNumber;
{$R *.dfm}
procedure TMainForm.AddEditBlockBtnClick(Sender: TObject);
var
newBlock: TBlock;
vContainer: TWinControl;
begin
if not IsGazetaOpened then
begin
ShowMessage('Невозможно добавить блок.'+#13+#10+'Не открыта ни одна страница');
Exit;
end;
//prepare block
newBlock := TBlock.Create;
with newBlock do
begin
SetAgent(CurrentUser);
SetFirma(FirmaEdit.Text);
SetPhone(PhoneEdit.Text);
SetPrepaied(PrepaiedEdit.Text);
case BlockSize.ItemIndex of
0: SetBlockSize(30);
1: SetBlockSize(60);
2: SetBlockSize(90);
3: SetBlockSize(120);
end;
case Orientation.ItemIndex of
0: SetOrientation(1); //horizontal
1: SetOrientation(0); //vertical
end;
SetText(BlockText.Text);
SetPageNumber(PageNumbers[PageControl.ActivePageIndex]);
end;
with ColorPages[PageControl.ActivePageIndex] do
begin
AddBlock(newBlock);
DrawBlock(newBlock);
end;
end;
procedure TMainForm.CloseTabs;
var
i: Byte;
begin
for i := 0 to PageControl.PageCount - 1 do
begin
PageControl.ActivePage.Free;
//ColorPages[i].Free;
end;
IsGazetaOpened := False;
end;
procedure TMainForm.CreateTab(TabNumber, PageNumber: Byte);
var
vSheet: TTabSheet;
begin
{create page tab}
vSheet := TTabSheet.Create(Self);
with vSheet do
begin
PageControl := MainForm.PageControl;
PageIndex := TabNumber;
Caption := 'Страница ' + IntToStr(PageNumber);
Show;
end;
ColorPages[TabNumber] := TColorPage.Create(PageNumber, GetBlocksQuery.RecordCount, vSheet);
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GetBlocksQuery.Close;
GetGazetaQuery.Close;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
if isAdmin then mAdmin.Enabled := True;
StatusBar.Panels[1].Text := 'Пользователь: ' + UpperCase(CurrentUser);
end;
procedure TMainForm.GetPageNumbers(Pages: String);
var
strLength: Byte;
i, j: Byte;
strPage: String;
begin
strLength := Length(Pages);
strPage := '';
j := 0;
SetLength(PageNumbers, GetGazetaQueryG_PAGECOUNT.Value);
for i := 1 to strLength + 1 do
begin
if (Pages[i] <> ',') and (Pages[i] <> #0) then strPage := strPage + Pages[i]
else begin
PageNumbers[j] := StrToInt(strPage);
Inc(j);
strPage := '';
end;
end;
end;
procedure TMainForm.ToolButton2Click(Sender: TObject);//первое действие после запуска
var
i: Byte;
begin
with GetGazetaQuery do
begin
ParamByName('G_NUMBER').Value := 1;
Open;
end;
GetPageNumbers(GetGazetaQueryG_PAGENUMBERS.Value);
SetLength(ColorPages,GetGazetaQueryG_PAGECOUNT.Value);
with GetBlocksQuery do
begin
ParamByName('G_ID').Value := GetGazetaQueryG_ID.Value;
Open;
end;
if IsGazetaOpened then CloseTabs;
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i]);
IsGazetaOpened := True;
end;
Германн (2006-11-09 17:55:00) [13]
> При запуске проги GazetaOpened = False и не меняется нигде
> до проверки
Темнишь. Где-то она всё же должна измениться.
Ketmar (2006-11-09 17:52:00) [14]после [7] я подозреваю, что новым открытием таки будет поток или неучтённый обработчик какого-то события.
lockheed_man (2006-11-09 17:41:00) [15]
> Тогда объясни в результате чего переменной GazetaOpened
> присваивается то или иное значение?
При запуске проги GazetaOpened = False и не меняется нигде до проверки, в которой проявляется проблема. Уже просмотрел каждую строку кода до которая выполняется до проверки условия. Значение сохраняется False, но увы. Вот.
Германн (2006-11-09 17:35:00) [16]
> lockheed_man © (09.11.06 17:27) [11]
>
>
> > Упал под стул :))))))
> >
> > Орех !!!
> >
>
> Может все таки посоветуете чего,плз?
Тогда объясни в результате чего переменной GazetaOpened присваивается то или иное значение?
lockheed_man (2006-11-09 17:27:00) [17]
> Упал под стул :))))))
>
> Орех !!!
>
Может все таки посоветуете чего,плз? Над своими ошибками сам посмеюсь с огромным удовольствием, только найти бы да решить.
ANB (2006-11-09 17:15:00) [18]Упал под стул :))))))
Орех !!!
lockheed_man (2006-11-09 17:08:00) [19]
> Ну и какая нафих тогда
Упс, сорри. Это простая будевая переменная. Никаких доп. потоков нет.
Сергей М. (2006-11-09 17:06:00) [20]
> Глобальная переменна объявлена как GazetaOpened: Boolean
> = False;
Ну и какая нафих тогда
> {булева функция}
если это просто переменная ?
И доп.потоки, надеюсь, тут ни при чем ?