Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор тестов, Тестирования кода 
:(
    Опции темы
Rohoss
Дата 3.7.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Я написал программку, и хотелось бы услышать критику специалистов. Пишу здесь, а не в разделе «тесты», потому, что программу выложил с исходным кодом. Тут все файлы проекта на Delphi 2006 + файл проекта для инно-сетап. Многие контролы  не стандартные, взяты отсюда. Отличаются от стандартных поддержкой скинов, а во всём остальном тоже. В названии класса присутствует буква «s», например TMemo – TsMemo. Хотелось бы узнать свои недостатки при написании кода, некоторые мелочи я и сам вижу, но может я что-то очень важное делаю не так…. Хотелось бы узнать мнение специалистов по данному коду. 
Исходник
Заранее спасибо!



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Bose
Дата 3.7.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



А нельзя ли поподробнее, какой код тестирует твоя программка, и какие тесты она генерирует? smile 
PM MAIL WWW Skype   Вверх
MadCoder
Дата 3.7.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



По-видимому, она тесты генерирует электронные для абитуриентов).
PM WWW ICQ   Вверх
THandle
Дата 3.7.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Глянул на код:
1. Оформлен плохо, читать неудобно.
2. Нет try..finally там, где им быть не плохо было бы.
3. Вот такой код тоже не украшает: 

Код

if sSaveDialog1.Execute then
begin
rht.SaveToFile(sSaveDialog1.FileName);
end;


Лишние begin..end.

Даже если там необходимо сделать было бы несколько действий, я предпочел бы писать так:

Код

if not sSaveDialog1.Execute then
  Exit;


//Some Code

Могу и и более тщательно посмотреть, но я не подхожу под вот эти критерии:

Цитата(Rohoss @  3.7.2008,  02:20 Найти цитируемый пост)
специалистов


 smile 

PM   Вверх
MadCoder
Дата 3.7.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



THandle, я думаю вполне подходишь. Посмотри пожалуйста вот эту тему, там как раз по теме твоего ника smile.
PM WWW ICQ   Вверх
Rohoss
Дата 3.7.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



THandle, под специалистами я имел ввиду  постоянных пользователей форума vingrad, так что вполне подходишь и ты и другие участники  smile 
Цитата(MadCoder @  3.7.2008,  11:04 Найти цитируемый пост)
По-видимому, она тесты генерирует электронные для абитуриентов).

А почему обязательно для абитуриентов?  smile 



Это сообщение отредактировал(а) Rohoss - 3.7.2008, 19:18


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
MadCoder
Дата 3.7.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(Rohoss @ 3.7.2008,  19:16)
THandle, под специалистами я имел ввиду  постоянных пользователей форума vingrad, так что вполне подходишь и ты и другие участники  smile 
Цитата(MadCoder @  3.7.2008,  11:04 Найти цитируемый пост)
По-видимому, она тесты генерирует электронные для абитуриентов).

А почему обязательно для абитуриентов?  smile

это так, к слову. А для кого?
PM WWW ICQ   Вверх
THandle
Дата 3.7.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(MadCoder @  3.7.2008,  13:49 Найти цитируемый пост)
THandle, я думаю вполне подходишь. Посмотри пожалуйста вот эту тему, там как раз по теме твоего ника


Там даже массив не из меня, а из каких то cardinal'ов smile 
На самом деле темы то я все смотрю, но не во все пишу smile  Появится желание - напишу и туда.

Такс. Ну начнем разбор. Сразу говорю - я не специалист даже близко, так что все комменты не професссиональны smile 


Код

procedure TfrmTest.SavePathList(const Path:string);
var
str:TStringList;
begin
str:=TStringList.Create;
if not str.Count=0 then
begin
str.LoadFromFile(ExtractFilePath(ParamStr(0))+'path.list');
if str[0]<>Path then str.Insert(0,Path);
end
else
begin
str.Add(Path);
end;
str.SaveToFile(ExtractFilePath(ParamStr(0))+'path.list');
str.Free;
end;


Нус:

Код

str:=TStringList.Create;


после этого надо начинать try..finally...

Код

if not str.Count=0 then


хм...

а не кажется ли тебе, что это условия не наступит? smile
После создания СтрингЛичта Count = 0.
Так что условие бесполезное...

Код

if str[0]<>Path then str.Insert(0,Path);


а вдруг ничо в файле и нет?

надо бы проверять...

Код

if Str.Count > 0 then
  if str[0]<>Path then 
    str.Insert(0,Path);


А теперь как я бы написал эту процедуру smile :

Код

procedure TfrmTest.SavePathList(const Path : string);
begin
  with TStringList.Create do
    try
      LoadFromFile(ExtractFilePath(ParamStr(0)) + 'path.list');
      if Str.Count <> 0 then
        begin
          if CompareText(Strings[0], Path) = 0 then 
            Insert(0, Path);
        end
      else
        Add(Path);
      SaveToFile(ExtractFilePath(ParamStr(0)) + 'path.list');
    finally
      Free;
    end;
end;


Завтра продолжу разбирать smile

PM   Вверх
Shaggy
Дата 4.7.2008, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 2.5.2007
Где: г.Ижевск

Репутация: 3
Всего: 5



Код

procedure TfrmTest.GeneralIniLoad; 
begin
  With TIniFile.Create(programDir+'config.ini'), FontEdit1 Do
    Try
      frmTest.Font.Name:=ReadString('Font','name',Dialog.Font.Name);
      frmTest.Font.Color:=ReadInteger('Font','Color',Dialog.Font.Color);
      frmTest.Font.Charset:=ReadInteger('Font','Charset',Dialog.Font.Charset);
      frmTest.Font.Size:=ReadInteger('Font','Size',Dialog.Font.Size);
      frmTest.Font.Style:=TFontStyles(Byte(StringToSet(GetPropInfo(Font,'Style'),ReadString('Font','Style',EmptyStr))));
    Finally
      Free;
    End;
end;


Код

procedure TfrmTest.FontEdit1Accept(Sender: TObject);
begin
  With TIniFile.Create(programDir+'config.ini'), FontEdit1 Do
    Try
      WriteString('Font','name',Dialog.Font.Name);
      WriteInteger('Font','Color',Dialog.Font.Color);
      WriteInteger('Font','Charset',Dialog.Font.Charset);
      WriteInteger('Font','Size',Dialog.Font.Size);
      WriteString('Font','Style',SetToString(GetPropInfo(Font,'Style'),Byte(Dialog.Font.Style));
    Finally
      Free;
    End;
  GeneralIniLoad; // <-- супер :)
end;


Код

procedure TfrmTest.FormCreate(Sender: TObject);
var
  Index:Integer;
  FileName:string;
begin
  ProgramDir:=ExtractFilePath(ParamStr(0));
  With TStringList.Create Do
    Try
      LoadFromFile(ProgramDir+'path.list');
      For Index:=0 To Min(9,Count-1) Do
        Reopen1.Add(NewItem(Strings[Index], 0, False, True, ExecSubMenu, 0, 'mi'+IntToStr(Index)));
    Finally
      Free;
    End;

  sSkinManager1.SkinDirectory:=ProgramDir;
  sSkinManager1.Active:=True;
  GeneralIniLoad;
  FileName:=ParamStr(1);
  If FileExists(FileName)
  Then
    Begin
      ClientDataSet3.FileName:=FileName;
      ClientDataSet3.Open;
      SavePathList(FileName);
      Zastroy;
    End;

end;


Код

procedure TfrmTest.ExecSubMenu;
begin
  FCloseExecute(Sender);
  ClientDataSet3.Close;
  ClientDataSet3.FileName:=(Sender As TMenuItem).Caption;
  ClientDataSet3.Open;
  Zastroy;
end;


это если по быстрому...

а условие:
Код

if not str.Count=0 then

не выполнится никогда... 
даже если str будет непустой
Цитата

Precedence of operators 
Operators                                   Precedence
@, not                                         first (highest)
*, /, div, mod, and, shl, shr, as    second
+, -, or, xor                                  third
=, <>, <, >, <=, >=, in, is            fourth (lowest)



Это сообщение отредактировал(а) Shaggy - 4.7.2008, 02:46
PM MAIL ICQ   Вверх
Rohoss
Дата 4.7.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Код

if not str.Count=0 then

Ну это же действительно бред… не пойму как мне такое в голову пришло… 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Rohoss
Дата 4.7.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



THandle В восьмой строчке у тебя ошибка надо так
Код

if CompareText(Strings[0], Path) <> 0 then



Shaggy, в TfrmTest.ExecSubMenu
Код

ClientDataSet3.FileName:=(Sender As TMenuItem).Caption;

В свойстве Caption появляется вот такой символ «&» он нужен для использования горячих клавишь, но он всю малину портит… Его как-то можно отключить?


Это сообщение отредактировал(а) Rohoss - 4.7.2008, 20:52


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
THandle
Дата 4.7.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Rohoss @  4.7.2008,  21:16 Найти цитируемый пост)
Ну это же действительно бред… не пойму как мне такое в голову пришло…  


Со всеми бывает smile 

Вообще отвлекусь от темы на чуть чуть и скажу как я пишу программы. Вдруг кому пригодится. smile

1. Думаем.
2. Находим идею.
3. Набрасываем на листочке примерный план действий.
4. Думаем что для этого требуется.
5. Пишем первый модуль. Я предпочитаю использовать ООП. То есть пишем на классах.
6. По ходу дела используем {$IFDEF} и прочее для всяких функций поднятия ошибок, логирования...
7. Так же, по ходу дела, тестируем все это в программке, офрмленной чисто для тест. Пара кнопок которые вызывают методы класса и тд.
8. Усиленно тестируем готовый модуль и гоняем его под дебаггером.
9. Все ли вместилось в этот модуль? Если да то дальше, иначе пишем таким же образом еще и остальные. Разбивать программу по не большим модулям(30-50 кб) лично для меня удобнее...
10. Оптимизируем код.
11. Создаем GUI.
12. Прикручиваем к нему код.  
13. Усиленно все это дело тестируем на разных машинках.
14. Два варианта: или отдаём юзерам или кладем программу в архив. smile 



Так. Теперь по делу. smile

Код

procedure TfrmTest.GeneralIniLoad;
var
ini:TIniFile;
fs,fs2:TFontStyles;
begin

ini:=TIniFile.Create(programDir+'config.ini');
frmTest.Font.Name:=ini.ReadString('Font','name',FontEdit1.Dialog.Font.Name);
frmTest.Font.Color:= ini.ReadInteger('Font','Color',FontEdit1.Dialog.Font.Color);
frmTest.Font.Charset:= ini.ReadInteger('Font','Charset',FontEdit1.Dialog.Font.Charset);
frmTest.Font.Size:= ini.ReadInteger('Font','Size',FontEdit1.Dialog.Font.Size);


if ini.ReadBool('Font','fsBold',false) then
fs:=[fsBold];

if ini.ReadBool('Font','fsItalic',false) then
fs2:=[fsItalic]; fs:=fs+fs2;

if ini.ReadBool('Font','fsUnderline',false) then
fs2:=[fsUnderline]; fs:=fs+fs2;

if ini.ReadBool('Font','fsStrikeOut',false) then
fs2:=[fsStrikeOut]; fs:=fs+fs2;

frmTest.Font.Style:=fs ;

ini.Free;

end;



Неплохо бы тут try..finally юзать...

Еще, лично я бы вынес всем имена разделов Ini файла и прочие такие вещи в resourcestring.


Код

procedure TfrmTest.FCloseExecute(Sender: TObject);
var
I:Integer;
begin
for I := 0 to sPageControl1.PageCount- 1 do
begin
  sPageControl1.Pages[0].Free;
end;


end;



Лишние begin..end. Не очень красиво смотрится. ИМХО.




Код

procedure TfrmTest.FontEdit1Accept(Sender: TObject);
var
ini:TIniFile;
begin
ini:=TIniFile.Create(programDir+'config.ini');
ini.WriteString('Font','name',FontEdit1.Dialog.Font.Name);
ini.WriteInteger('Font','Color',FontEdit1.Dialog.Font.Color);
ini.WriteInteger('Font','Charset',FontEdit1.Dialog.Font.Charset);
ini.WriteInteger('Font','Size',FontEdit1.Dialog.Font.Size);

if fsBold in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsBold',true) else
ini.WriteBool('Font','fsBold',false);

if fsItalic in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsItalic',true) else
ini.WriteBool('Font','fsItalic',false);

if fsUnderline in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsUnderline',true) else
ini.WriteBool('Font','fsUnderline',false);

if fsStrikeOut in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsStrikeOut',true) else
ini.WriteBool('Font','fsStrikeOut',false);


ini.Free;
GeneralIniLoad;
end;



Опять таки нужен try..finally.

И еще:
Ну зачем, ну зачем нужна такая не красивая запись типа:
Код


if fsBold in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsBold',true) else
ini.WriteBool('Font','fsBold',false);


Все очень легче сделать так:

Код

Ini.WriteBool('Font', 'fsBold', fsBold in FontEdit1.Dialog.Font.Style);


И остальное так же...

На сегодня хватит... Времени нет... Завтра продолжу. ОК?

А вообще:

Код построен на одних компонентах, никакой романтики smile 



Цитата(Rohoss @  4.7.2008,  21:36 Найти цитируемый пост)
THandle В восьмой строчке у тебя ошибка надо так



 smile 

Немножко условие не приметил, пишу то тут smile 

PM   Вверх
Shaggy
Дата 4.7.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 2.5.2007
Где: г.Ижевск

Репутация: 3
Всего: 5



Цитата(Rohoss @  4.7.2008,  22:36 Найти цитируемый пост)
В свойстве Caption появляется вот такой символ «&» он нужен для использования горячих клавишь, но он всю малину портит… Его как-то можно отключить?

Код

MainMenu.AutoHotKeys:=maManual;

PM MAIL ICQ   Вверх
Rohoss
Дата 5.7.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



THandle, а зачем так усилено try..finally юзать? Ведь появления исключения при работе с ини-файлами большая редкость, я например, никогда не замечал. 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
THandle
Дата 5.7.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Rohoss @  5.7.2008,  12:34 Найти цитируемый пост)
THandle, а зачем так усилено try..finally юзать? Ведь появления исключения при работе с ини-файлами большая редкость, я например, никогда не замечал.  


А вдруг? Надо быть готовым ко всему. Поэтому и следует всегда для таких целей использовать try..finally.
PM   Вверх
THandle
Дата 6.7.2008, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



И так, продолжимс...
Код


procedure TfrmTest.FormCreate(Sender: TObject);
  var
  str:TStringList;
  I,x:Integer;
  mi:TMenuItem;
  s:string;
begin
programDir:=ExtractFilePath(ParamStr(0));
str:=TStringList.Create;
x:=9;
str.LoadFromFile(ExtractFilePath(ParamStr(0))+'path.list');
if x>str.Count - 1 then x:=str.Count - 1;

for I := 0 to x do
   begin
     mi:=TMenuItem.Create(MainMenu1);
     mi.Caption:=str[I];
     mi.Name:='mi'+IntToStr(I);
     mi.Tag:=I;
     mi.OnClick:=ExecSubMenu;
     Reopen1.Add(mi);
   end;
sSkinManager1.SkinDirectory:=ExtractFilePath(ParamStr(0));
sSkinManager1.Active:=true;
GeneralIniLoad;
s:=ParamStr(1);
if Length(s)>3 then
begin
ClientDataSet3.FileName:=s;
ClientDataSet3.Open;
FileOpen1.Dialog.FileName:=s;
SavePathList(s);
Zastroy;
end;

end;




Первое что бросается в глаза - неосмысленные какие-то значения: 8, 3...
Я бы вынес их в константы с понятным именем. А то разбираться в коде, в котором присутствуют подобные числа - довольно сложно.
Так же не плохо было бы использовать, вообще, везде в программе, комментарии. Я комментирую практически каждую строчку кода, что не является хорошо. Советую комментировать хотя бы переменные.

Дальше...

Откуда тут вообще берется некий ParamStr(1). Он вообще хто такой?
Не вижу тут опять try..finally и не вижу освобождения занятых ресурсов...
Кстати... Zastroy - это супер название. Очень понравилось smile 


Сегодня продолжать не могу - интернет кончился :( теперь завтра.


Rohoss, советую начать переписывать программу учитывая все замечания. А так же, огромная просьба - оформлять код красиво.
Для меня красиво - то как оформлен мой код. Хотя это тоже не идеально. Но глянь пару моих сообщений и делай хотя бы так же. Просто намного приятнее будет читать такое. Еще не плохо бы поменять названия переменных. Они должны восприниматься на лету.


Например представь:

Есть у нас класс - Кот(Животное).
Есть у него метод - мяукать.

Объявишь ты переменную, с названием x.

И что же?

Разве красиво будет выглядить такое?

x.Мяукать;

Нет.

Намного лучше назвать все это осмысленным именем.
Например:

КотВаська : Кот;

КотВаська.Мяукать;

Ведь намного же легче читается?

Ну вот и постарайся чтобы твой код можно было читать на одном дыхании. Как какую-нибудь очень интересную книгу. smile 

Вот пример такого кода:

http://forum.vingrad.ru/forum/topic-204531.html



Удачи!!!
PM   Вверх
Rohoss
Дата 7.7.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Делаю пока такие выводы
1.    Чаще использовать try finaly , тем более, где вопрос касается создания объектов
2.    Использовать константы (почти вообще не использую)
3.    Комментарии (обычно комментирую, но редко)
Названия переменных для меня лично понятны, хотя над этим тоже надо подумать…
THandle, не плохо если бы ты выслал часть своего кода посмотреть….



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Rohoss
Дата 7.7.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



"Zastroy" - это у меня стандартное название  smile 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
THandle
Дата 8.7.2008, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Rohoss @  7.7.2008,  20:16 Найти цитируемый пост)
1.    Чаще использовать try finaly , тем более, где вопрос касается создания объектов
2.    Использовать константы (почти вообще не использую)
3.    Комментарии (обычно комментирую, но редко)


Вот давай переписывай код с учетом этого smile 

Цитата(Rohoss @  7.7.2008,  20:16 Найти цитируемый пост)

Названия переменных для меня лично понятны, хотя над этим тоже надо подумать…


Названия переменных типа:

Код


rht:THTMLout;
voprStr:TStringList;
otv,rotv:string;
tg,inx:Integer;
rb:boolean;
sm:TsMemo;
sR:TsRadioGroup;


Мне лично категорически не понятны smile 

Цитата(Rohoss @  7.7.2008,  20:16 Найти цитируемый пост)
THandle, не плохо если бы ты выслал часть своего кода посмотреть….


Не могу. Так как:

http://forum.vingrad.ru/forum/topic-219450.html

Сейчас просто на ноутбуке только код с текущего проекта, который еще не является даже полностью рабочим.


Цитата(Rohoss @  7.7.2008,  20:35 Найти цитируемый пост)
"Zastroy" - это у меня стандартное название


 smile 


Дальше глянем:
Код


procedure TfrmTest.SaveResult;
var
I:Integer;
rht:THTMLout;
voprStr:TStringList;
otv,rotv:string;
tg,inx:Integer;
rb:boolean;
sm:TsMemo;
sR:TsRadioGroup;
begin
voprStr:=TStringList.Create;

rht:=THTMLout.Create(nameTest);
 for I := 0 to sPageControl1.PageCount-1 do
   begin
   sm:=(frmTest.sPageControl1.Pages[I].FindComponent('sMeM'+IntToStr(I))as TsMemo);
   voprStr.Text:=sm.Text;

   //ShowMessage(voprStr.Text);
   tg:=sPageControl1.Pages[I].Tag;

   sR:=(frmTest.sPageControl1.Pages[I].FindComponent('sRG'+IntToStr(I)) as TsRadioGroup);
   inx:=sR.ItemIndex;
   try
   otv:=sR.Items[inx];
   except
   otv:='Без ответа'
   end;

   try
   rotv:=sR.Items[tg-1];
   except
   rotv:='Правильный ответ не был назначен';
   end;
   rb:= tg-1=inx;
   rht.Add(voprStr,otv,rotv,rb);

   end;

sSaveDialog1.FileName:='Result.html';
if sSaveDialog1.Execute then
begin
rht.SaveToFile(sSaveDialog1.FileName);
end;
voprStr.Free;
rht.Free;
ShellExecute(0,'OPEN',PChar(sSaveDialog1.FileName), Nil, Nil, SW_SHOW);

end;



Вот это не понятно:
Код


   inx:=sR.ItemIndex;
   try
   otv:=sR.Items[inx];
   except
   otv:='Без ответа'
   end;


Как то не красиво выглядит. Неужели обычной проверкой нельзя узнать чему равен Inx, и исходя из этого уже присваивать значения?


Ну в этом юните вроде все...
Хотя возможно я что-то проглядел.

Код

type THTMLout = class
constructor Create(testName:string);
destructor Destroy; reintroduce;
procedure Add(vopros:TStringList;otv,rightotv:string;rigght:boolean);
procedure SaveToFile(FileName:string) ;
 private
  fTable:TStringList;
  fSumOtv, fSumRightOtv:Integer;
end;



Лично мне удобнее описывать члены класса в таком порядке:

private
protected
public


Да и привычнее как-то выглядело бы...

Код


for I := 0 to vopros.Count - 1 do
 begin
  tempStr.Add('<p>'+vopros[I]);
 end;


Лишние begin..end. Не красиво выглядит.

Код


righ:string;


Не понятно почему string. Судя по тем значениям. которые этой переменной присваиваются тут вполне хватило бы char.
Код


try
x:=DataModule1.ClientDataSet1.RecNo;
DataModule1.ClientDataSet1.First;
DataModule1.ClientDataSet1.Edit;
DataModule1.ClientDataSet1.Fields[4].AsString:=edtNameQuestion.Text;
DataModule1.ClientDataSet1.Post;
DataModule1.ClientDataSet1.RecNo:=x;
except
end;



Вот это есть не хорошо. Гасить ошибку... 

Код


  if ffEdit='' then
   begin
    CreateBase;
   end


Опять лишние... Не красиво читается.




Ну вроде бы все... Переписывай код с учетом всех замечаний и выкладывай сюда. Будем смотреть smile 

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4977 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.