Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Вниз

Разное исполенение кода при дебаге и при простом запуске   Найти похожие ветки 

 
lockheed_man ©   (2006-11-09 16:47) [0]

Ув. Мастера, есть такой код
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. От чего это может зависеть? Заранее спасибо.


 
Сергей М. ©   (2006-11-09 16:48) [1]


> От чего это может зависеть?


От времени, разумеется ...От чего же еще ?


 
Dmitrij_K   (2006-11-09 16:48) [2]

в 99,9% это ошибка в программе


 
Ketmar ©   (2006-11-09 16:50) [3]

сильно подозреваю, что это зависит от ошибки в программе.

зыж маленький совет: можно для наглядности булевы функции вызывать как GazetaOpened(). ещё такие функции лучше начинать с "Is".


 
lockheed_man ©   (2006-11-09 16:55) [4]


> От времени, разумеется ...От чего же еще ?
>

Извини, не понял. Можно по-популярнее?


 
lockheed_man ©   (2006-11-09 17:01) [5]

Глобальная переменна объявлена как GazetaOpened: Boolean = False;
Первый раз используется именно в этом куске кода и только потом изменяется. Т.е. прямо после запуска программы должен был выполняться else, что и происходит при пошаговом исполнении, а при простом прогоне проги выполняется только
begin
  CloseTabs;
  for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i])
end

Уже несколько раз прошел по коду. Ума не приложу в чем причина.


 
Сергей М. ©   (2006-11-09 17:04) [6]


> не понял


Да что тут понимать-то ?)

При F8 ф-ция GazetaOpened() выполняется, скажем, 2 сек (с учетом неявных действий дубового дельфийскогоотладчика), а при F9 она же выполняется, скажем, 1 сек. ... А внутренняя логика этой ф-ции при этом немало зависит от тех самых времен ...
Еще страшней предположение, что внутри ф-ции анализируется признакт работы процесса под отладчиком)


 
Ketmar ©   (2006-11-09 17:04) [7]

опа. функция волшебным образом превратилась в переменную. какие ещё открытия нас ждут?


 
Сергей М. ©   (2006-11-09 17:06) [8]


> Глобальная переменна объявлена как GazetaOpened: Boolean
> = False;


Ну и какая нафих тогда
> {булева функция}


если это просто переменная ?

И доп.потоки, надеюсь, тут ни при чем ?


 
lockheed_man ©   (2006-11-09 17:08) [9]


> Ну и какая нафих тогда

Упс, сорри. Это простая будевая переменная. Никаких доп. потоков нет.


 
ANB ©   (2006-11-09 17:15) [10]

Упал под стул :))))))

Орех !!!


 
lockheed_man ©   (2006-11-09 17:27) [11]


> Упал под стул :))))))
>
> Орех !!!
>

Может все таки посоветуете чего,плз? Над своими ошибками сам посмеюсь с огромным удовольствием, только найти бы да решить.


 
Германн ©   (2006-11-09 17:35) [12]


> lockheed_man ©   (09.11.06 17:27) [11]
>
>
> > Упал под стул :))))))
> >
> > Орех !!!
> >
>
> Может все таки посоветуете чего,плз?

Тогда объясни в результате чего переменной GazetaOpened присваивается то или иное значение?


 
lockheed_man ©   (2006-11-09 17:41) [13]


> Тогда объясни в результате чего переменной GazetaOpened
> присваивается то или иное значение?

При запуске проги GazetaOpened = False и не меняется нигде до проверки, в которой проявляется проблема. Уже просмотрел каждую строку кода до которая выполняется до проверки условия. Значение сохраняется False, но увы. Вот.


 
Ketmar ©   (2006-11-09 17:52) [14]

после [7] я подозреваю, что новым открытием таки будет поток или неучтённый обработчик какого-то события.


 
Германн ©   (2006-11-09 17:55) [15]


> При запуске проги GazetaOpened = False и не меняется нигде
> до проверки

Темнишь. Где-то она всё же должна измениться.


 
lockheed_man ©   (2006-11-09 20:21) [16]

Как говорится: "Код в студию"
...
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-10 00:13) [17]

Дал новый код, давай теперь новый вопрос.


 
lockheed_man ©   (2006-11-10 01:44) [18]


> Дал новый код, давай теперь новый вопрос.

Забрал только else, не нужно его там было, но от этого ничего не изменилось.Проблема осталась, процедура CloseTabs выполняется в любом случае.А есть хоть какие-нибудь предположения почему такое может происходить?Может глюк компилятора,а?


 
Германн ©   (2006-11-10 01:59) [19]

Не нашел в коде ни одного места, где переменной IsGazetaOpened присваивается True, кроме procedure TMainForm.ToolButton2Click. Но в ней всё чисто, вроде бы. Нет ли у тебя ещё кода, который ты не привёл?
На "глюк компиллятора" пока не стоит упирать.


 
lockheed_man ©   (2006-11-10 02:04) [20]

Вот полный вариант модуля:
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 02:59) [21]

По приведённому в [20] коду всё нормально. Но на "глюк компиллятора" по прежнему не расчитывай.


 
lockheed_man ©   (2006-11-10 04:36) [22]


> По приведённому в [20] коду всё нормально. Но на "глюк компиллятора"
> по прежнему не расчитывай.
>

Получается, что без вариантов. Да уж, голяк. В любом случае спасибо за терпение и комментарии.


 
ЮЮ ©   (2006-11-10 05:33) [23]


> Когда исполняю его по 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" - источник проблем


 
Loginov Dmitry ©   (2006-11-10 07:56) [24]

Dmitrij_K   (09.11.06 16:48) [2]
в 99,9% это ошибка в программе


как минимум 99,99%

^)


 
lockheed_man ©   (2006-11-10 08:34) [25]

Всем спасибо. Причину нашел. > как минимум 99,99% - чистая правда. Неправильно связал пункт меню и кнопку, связанную с этим пунктом. Как результат - процедура выполнялась дважды.
Всем большое спасибо за советы и критику.


 
Rouse_ ©   (2006-11-10 11:26) [26]

если хочешь еще критику то
> "Не открыта ни одна страница" будет аналогом: русский речь меня покинул ;)


 
lockheed_man ©   (2006-11-10 13:59) [27]


> если хочешь еще критику то
> > "Не открыта ни одна страница" будет аналогом: русский
> речь меня покинул ;)
>

И сразу же свой вариант, плз.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.114 c
15-1165223378
Zero
2006-12-04 12:09
2006.12.24
pocket pc


2-1165250749
novex
2006-12-04 19:45
2006.12.24
Вычисления А в степени Х


4-1155818891
misha_gr
2006-08-17 16:48
2006.12.24
Два глупых вопроса по поводу DLL...


15-1164984386
grisme
2006-12-01 17:46
2006.12.24
UTF-8


2-1165237693
Steep
2006-12-04 16:08
2006.12.24
Opengl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский