Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2016, 06:50   #1
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
Сообщение подскажите, как сократить код?

Код:
//Load star
procedure TKamasutraForm.IntertelecomLoadStar;
begin
//IntertelecomLoad;
   ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
   if TrackBarGIF.Position = 1 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress1', StarProgress.Position);

 // тут была ошибка - не поставил был end; else 
(в другой теме решал вопрос - не сохраняло позицию звезд )


   if TrackBarGIF.Position = 2 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress2', StarProgress.Position);
   ini.Destroy;
 end; end; end;
подскажите, как сократить код, а то записей 140, громоздко получается:

вот только для 6 позиций сколько строк получается:

Код:
//Save star
procedure TKamasutraForm.IntertelecomSaveStar;
begin
//IntertelecomLoad;
   ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
   if TrackBarGIF.Position = 1 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress1', StarProgress.Position); end else
   if TrackBarGIF.Position = 2 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress2', StarProgress.Position); end else
   if TrackBarGIF.Position = 3 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress3', StarProgress.Position); end else
   if TrackBarGIF.Position = 4 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress4', StarProgress.Position); end else
   if TrackBarGIF.Position = 5 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress5', StarProgress.Position); end else
   if TrackBarGIF.Position = 6 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress6', StarProgress.Position);end;
   ini.Destroy;
end;

//Load star
procedure TKamasutraForm.IntertelecomLoadStar;
begin
//IntertelecomLoad;
   ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
   if TrackBarGIF.Position = 1 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress1', StarProgress.Position); 
end else
   if TrackBarGIF.Position = 2 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress2', StarProgress.Position); 
end else
   if TrackBarGIF.Position = 3 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress3', StarProgress.Position); 
end else
   if TrackBarGIF.Position = 4 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress4', StarProgress.Position); 
end else
   if TrackBarGIF.Position = 5 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress5', StarProgress.Position); 
end else
   if TrackBarGIF.Position = 6 then
   begin
   StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress6', StarProgress.Position);
 end;
   ini.Destroy;
 end;
такой софт:


Последний раз редактировалось beegl; 26.04.2016 в 07:00.
beegl вне форума Ответить с цитированием
Старый 26.04.2016, 07:32   #2
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 156
По умолчанию

Вероятно в прошлой теме до вас так и не достучались

вот это должно быть в onchange trackbar-а со "звёздами"
Код:
 try 
    ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
    ini.WriteInteger('StarProgressDef', 'img_'+IntToStr(TrackBarGIF.Position),StarProgress.Position);
 finally
   ini.Free;
 end;
это в событии onchange trackbar-а с номером изображения:
Код:
 try
    ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
    StarProgress.Position:= ini.ReadInteger('StarProgressDef', 'img_'+IntToStr(TrackBarGIF.Position),0);
    ini.WriteInteger('Main','Position',TrackBarGIF.Position);
 finally
   ini.Free;
 end;
это в oncreate формы:
Код:
 try
   ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
   TrackBarGIF.Position:=ini.ReadInteger('Main','Position',1);
   StarProgress.Position:= ini.ReadInteger('StarProgressDef', 'img_'+IntToStr(TrackBarGIF.Position),0);
 finally
   ini.Free;
 end;
и никакого блуждания в 3-х соснах и code smell-а.
DIONISKA вне форума Ответить с цитированием
Старый 26.04.2016, 08:32   #3
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

а тем методом получилось 850 строк))

этим:

Код:
procedure TKamasutraForm.IntertelecomSaveStar;
begin
//IntertelecomLoad;
   ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
   if TrackBarGIF.Position = 1 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress1', StarProgress.Position); end else
   if TrackBarGIF.Position = 2 then
   begin
   ini.WriteInteger('StarProgressDef', 'StarProgress2', StarProgress.Position); end else
..
 N!
Ща протестю Ваш метод.



Ошибка чтения INI-файла, при запуске проекта.

Содержание INI:

Код:
[Main]
Position=7
[StarProgressDef]
SEX5.GIF=3
SEX6.GIF=0
SEX7.GIF=5
SEX8.GIF=4
SEX9.GIF=0
SEX23.GIF=5
SEX116.GIF=0
такой код:

StarProgressChange

Код:
procedure TKamasutraForm.StarProgressChange(Sender: TObject);
begin
try
  ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
  ini.WriteInteger('StarProgressDef', Label3.Caption ,StarProgress.Position);
finally
   ini.Free;
 end;
end;
TrackBarGIFChange:

Код:
procedure TKamasutraForm.TrackBarGIFChange(Sender: TObject);
begin
try
  ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
  StarProgress.Position:= ini.ReadInteger('StarProgressDef', Label3.Caption ,0);
  ini.WriteInteger('Main','Position',TrackBarGIF.Position);
finally
   ini.Free;
 end;
end;
OnCreate:

Код:
procedure TKamasutraForm.FormCreate(Sender: TObject);
begin
try
 ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
 TrackBarGIF.Position:=ini.ReadInteger('Main','Position',TrackBarGIF.Position);
 StarProgress.Position:= ini.ReadInteger('StarProgressDef', Label3.Caption ,0);
finally
   ini.Free;
 end;
end;
- где Label3.Caption имя файла (пример: IMG1.GIF)

- имя файла доставал так:

Код:
if FileExists(ExtractFilePath(Application.ExeName) + 'IMG\IMG' +
 IntToStr(TrackBarGIF.Position) +'.GIF') then
begin
DisplayGIF.Image.LoadFromFile(ExtractFilePath(Application.ExeName) +'IMG\IMG' 
+ IntToStr(TrackBarGIF.Position) +'.GIF');
Label3.Caption := 'IMG' + IntToStr(TrackBarGIF.Position) +'.GIF';
end;

Последний раз редактировалось beegl; 26.04.2016 в 09:10. Причина: Edit text and add IMG
beegl вне форума Ответить с цитированием
Старый 26.04.2016, 10:45   #4
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

Возвратиться к методу 850 строк?

Такая иногда ошибка бывает с try, когда сканирует секцию INI из сохраненной позицией StarProgress, а если пропущена сохраненная позиция, то ошибки нет:



Добавил исключение, ошибок нету:

Код:
public
    { Public declarations }
    procedure GlobalException(sender: Tobject; Ex: Exception);
    procedure LocalExExcept(Sender:TObject; E:Exception);
   end;
On Create

Код:
Application.OnException := GlobalException;
Application.OnException := LocalExExcept;

Код:
//******Исключительные ситуации******//
procedure TKamasutraForm.GlobalException(sender: Tobject; Ex: Exception);
begin
Exit;
ShowMessage('ErrorEx' + Ex.ClassName + ':' + Ex.Message +#13#10'End');
end;

Код:
//******Исключительные ситуации******//
procedure TKamasutraForm.LocalExExcept(Sender:TObject; E:Exception);
begin
  if E is EInOutError then
    Exit
  else
  if E is EOSError then
    Exit
  else
  if E is EPackageError then
    Exit
  else
  if E is EInvalidInsert then
    Exit
  else
  if E is EIntfCastError then
    Exit
  else
  if E is EAbstractError then
    Exit
  else
  if E is EVariantError then
    Exit
    else
  if E is EConvertError then
    Exit
  else
  if E is EIntError then
    Exit;
end;
//******//

Последний раз редактировалось beegl; 26.04.2016 в 11:30. Причина: Edit text and add IMG
beegl вне форума Ответить с цитированием
Старый 26.04.2016, 12:20   #5
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

Теперь подскажите, как бы его читать/проверять секцию INI, и если нет ещё "оценки",
то StarProgress.Position := 0;, а не предыдущему результату?

Так проверял, не проскандировало секцию:

Код:
procedure TKamasutraForm.StarTimerTimer(Sender: TObject);
begin
StarTimer.Enabled := False;
try
 ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
 Label3.Caption := ini.ReadString('StarProgressDef','LabelCaptionExt',Label3.Caption);
 TrackBarGIF.Position := ini.ReadInteger('StarProgressDef','TrackBarGIFPosition',TrackBarGIF.Position);
 StarProgress.Position := ini.ReadInteger('StarProgressDef', Label3.Caption, StarProgress.Position);
 if StarProgress.Position = ini.ReadInteger('StarProgressDef', нет записи, StarProgress.Position) then
 begin
  StarProgress.Position := 0;
 end;
finally
   ini.Destroy;
end;
end;

Последний раз редактировалось beegl; 26.04.2016 в 12:29. Причина: Edit text
beegl вне форума Ответить с цитированием
Старый 26.04.2016, 12:28   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
подскажите, как сократить код, а то записей 140, громоздко получается
А так не пойдет?
Код:
procedure TKamasutraForm.IntertelecomSaveStar;
begin
//IntertelecomLoad;
ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
ini.WriteInteger('StarProgressDef', 'StarProgress'+IntToStr(TrackBarGIF.Position), StarProgress.Position);
ini.Destroy;
end;

procedure TKamasutraForm.IntertelecomLoadStar;
begin
//IntertelecomLoad;
ini := TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'SaveStar.ini');
StarProgress.Position := ini.ReadInteger('StarProgressDef', 'StarProgress'+IntToStr(TrackBarGIF.Position), 0);
ini.Destroy;
end;
kropotkina-alice вне форума Ответить с цитированием
Старый 26.04.2016, 12:31   #7
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 156
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
Теперь подскажите, как бы его читать/проверять секцию INI, и если нет ещё "оценки",
то StarProgress.Position := 0;, а не предыдущему результату?
Код:
//...
StarProgress.Position := ini.ReadInteger('StarProgressDef', Label3.Caption, 0);
//...
это-же вроде в примере что в лс прислал было, не?
из справки
Код:
function: ReadInteger(const Section: string; const Ident: string; Default: Longint): Longint; virtual;
значение "Default" возвращается при отсутствии записи, т.е. будет равно 0
DIONISKA вне форума Ответить с цитированием
Старый 26.04.2016, 12:32   #8
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
Лампочка

Цитата:
Сообщение от DIONISKA Посмотреть сообщение
Код:
//...
StarProgress.Position := ini.ReadInteger('StarProgressDef', Label3.Caption, 0);
//...
это-же вроде в примере что в лс прислал было, не?
из справки
Код:
function: ReadInteger(const Section: string; const Ident: string; Default: Longint): Longint; virtual;
значение "Default" возвращается при отсутствии записи, т.е. будет равно 0
напишите пример, так не проверяет:

Код:
if StarProgress.Position = ini.ReadInteger('StarProgressDef', нет записи, StarProgress.Position) then
 begin
  StarProgress.Position := 0;
 end;

Последний раз редактировалось beegl; 26.04.2016 в 12:35. Причина: Edit text
beegl вне форума Ответить с цитированием
Старый 26.04.2016, 12:43   #9
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 156
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
напишите пример, так не проверяет:

Код:
if StarProgress.Position = ini.ReadInteger('StarProgressDef', нет записи, StarProgress.Position) then
 begin
  StarProgress.Position := 0;
 end;
не нужно никаких условий, значение default и есть то что вернёт функция не найдя записи.

это и был пример:
Код:
StarProgress.Position := ini.ReadInteger('StarProgressDef', Label3.Caption, 0);
впрочем если угодно то можно и так:
Код:
var i:integer;
begin
  i:=ini.ReadInteger('StarProgressDef', Label3.Caption, -1);
  if i=-1 then showmessage('Нет записи') else StarProgress.Position:=i;
DIONISKA вне форума Ответить с цитированием
Старый 26.04.2016, 13:23   #10
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
Лампочка

Цитата:
Сообщение от DIONISKA Посмотреть сообщение
Код:
var i:integer;
begin
  i:=ini.ReadInteger('StarProgressDef', Label3.Caption, -1);
  if i=-1 then showmessage('Нет записи') else StarProgress.Position:=i;
проверяет, а иногда не реагирует, возможно из-за некоторых Exception, которые "пропустил"?

Код:
Application.OnException := GlobalException;
Application.OnException := LocalExExcept;
Решил ошибку, заполнив INI - для всех секций нулями:

Код:
[StarProgressDef]
LabelCaptionExt=SEX1.GIF
SEX1.GIF=0
TrackBarGIFPosition=0
SEX1.GIF=0
SEX2.GIF=0
SEX3.GIF=0
SEX4.GIF=0
SEX5.GIF=0
SEXn!.GIF=n!
Вложения
Тип файла: txt SaveStar.txt (1.9 Кб, 138 просмотров)

Последний раз редактировалось beegl; 26.04.2016 в 14:13. Причина: add File
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сократить код? Вадим12091965 Microsoft Office Excel 11 19.09.2013 20:39
Как сократить код Вадим12091965 Microsoft Office Excel 6 28.10.2012 11:04
как можно сократить код sergio280888 БД в Delphi 0 17.04.2011 17:09
Как сократить код DLL ProgDel Общие вопросы Delphi 3 16.02.2010 21:12
Как можно сократить код jocry Общие вопросы Delphi 2 20.01.2009 08:35