Лекс Айрин писал(а):pda, а кто говорит, что FPC хорошо написан?
Плохо?

- Код: Выделить всё
if (!buffer)
return -ENOMEM;
для вас тоже плохо написано?

Модератор: Модераторы
Лекс Айрин писал(а):pda, а кто говорит, что FPC хорошо написан?
if (!buffer)
return -ENOMEM;
Лекс Айрин писал(а):забейте на Exit. Как правило, если он используется, то значит программист не очень хорошо проработал код в данном месте программы. Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
If Err>0 then
Begin
...
End
Else //лучше, конечно, неполный if, но FPC возникают иногда ошибки :((
Begin end;
If Err=0 then exit
Else
Begin
...
end;
Лекс Айрин писал(а):почему я должен писать так?
Лекс Айрин писал(а):Наличие этой ветки косяк компилятора.
If Err=0 then exit;
Лекс Айрин писал(а):Поиграв с порядком проверок, так же можно значительно сократить их количество.
pda писал(а):Лолшто? У вас не работает
pda писал(а):Хотел бы посмотреть на случай if внутри case...
procedure TMainForm.MenuOpenClick(Sender: TObject);
var
Str: TStringList;
begin
Str := TStringList.Create;
if OpenDialog1.Execute then
begin
MyFile := OpenDialog1.FileName;
Caption := MyFile + ':LexEditor';
// ожидается выбор кодировки текста
case OpenDialog1.FilterIndex of
1:
begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
2:
begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
3:begin // *.* UTF8
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
4:begin // *.* Win1251
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
else
begin
end;
end;
end
else
begin
end;
Str.Free;
MainForm.ShellTreeView1.Path:=MainForm.OpenDialog1.InitialDir;
end;
Лекс Айрин писал(а):У меня неправильно работает неполный if...
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
MyFile := OpenDialog1.FileName;
Caption := MyFile + ':LexEditor';
// ожидается выбор кодировки текста
MainEditor.Lines := load_text(OpenDialog1.FilterIndex, MyFile)
end else
begin
////
end;
ShellTreeView1.Path := OpenDialog1.InitialDir;
end;
function TForm1.load_text(a_value: integer; const a_file: string): TStrings;
function get_path(a_name : string) : string;
begin
result := ConvertEncoding(a_name, EncodingUTF8, GetDefaultTextEncoding);
end;
var
Str: TStringList;
begin
Str := TStringList.create;
Str.LoadFromFile(get_path(a_file));
case a_value of
1 : result := Str;
2 : result.Text := CP1251ToUTF8(Str.Text);
3 : result := Str;
4 : result.Text := CP1251ToUTF8(Str.Text);
end;
Str.free;
end;
function TDTListIndexOf(aList : TList; aItem : pointer;
aCompare : TtdCompareFunc) : integer;
var
Inx : integer;
begin
for Inx := 0 to pred(aList.Count) do
if (aCompare(aList.List^[Inx], aItem) = 0) then begin
Result := Inx;
Exit;
end;
Result := -1;
end;
У меня неправильно работает неполный if...
и...то посчитал более перспективным работать с нуля.
Весьма странно. Т.е. вы заново фпс переписываете или э...э.Собственно, по этому пишем-с на FPC.
Лекс Айрин писал(а):не... есть только Case внутри if
- Код: Выделить всё
procedure TMainForm.MenuOpenClick(Sender: TObject);
var
Str: TStringList;
begin
Str := TStringList.Create;
if OpenDialog1.Execute then
begin
MyFile := OpenDialog1.FileName;
Caption := MyFile + ':LexEditor';
// ожидается выбор кодировки текста
case OpenDialog1.FilterIndex of
1:
begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
2:
begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
3:begin // *.* UTF8
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
4:begin // *.* Win1251
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
else
begin
end;
end;
end
else
begin
end;
Str.Free;
MainForm.ShellTreeView1.Path:=MainForm.OpenDialog1.InitialDir;
end;
ЗЫ: постараюсь убрать этот код
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
Лекс Айрин писал(а): Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
procedure TIcon.SetStatus(AValue: TStatus);
begin
if FStatus = AValue then Exit;
if (FStatus = csFocus) and (AValue = csHot) then Exit;
FStatus := AValue;
if (AValue = csFocus) and (Parent is TBranch) then TBranch(Parent).IconFocus := Self;
end;
Лекс Айрин писал(а):у... это еще тот геморрой.... сейчас поищу... не... есть только Case внутри if
- Код: Выделить всё
procedure TMainForm.MenuOpenClick(Sender: TObject);
var
Str: TStringList;
begin
Str := TStringList.Create;
if OpenDialog1.Execute then
begin
MyFile := OpenDialog1.FileName;
Caption := MyFile + ':LexEditor';
// ожидается выбор кодировки текста
case OpenDialog1.FilterIndex of
1:
begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
2:
begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
3:begin // *.* UTF8
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
4:begin // *.* Win1251
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
else
begin
end;
end;
end
else
begin
end;
Str.Free;
MainForm.ShellTreeView1.Path:=MainForm.OpenDialog1.InitialDir;
end;
procedure MenuOpenClick(Sender: TObject);
var Str: TStringList;
begin
if not OpenDialog1.Execute then Exit;
Str := TStringList.Create;
try
MyFile := OpenDialog1.FileName;
Caption := MyFile + ':LexEditor';
// ожидается выбор кодировки текста
case OpenDialog1.FilterIndex of
1: begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
2: begin
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
3: begin // *.* UTF8
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
end;
4: begin // *.* Win1251
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
end;
end;
MainForm.ShellTreeView1.Path:=MainForm.OpenDialog1.InitialDir;
finally
Str.Free;
end;
end;
pupsik писал(а):по поводу последнего кода:
Пример из книги по алгоритмам (первый попавшийся):
- Код: Выделить всё
function TDTListIndexOf(aList : TList; aItem : pointer;
aCompare : TtdCompareFunc) : integer;
var
Inx : integer;
begin
for Inx := 0 to pred(aList.Count) do
if (aCompare(aList.List^[Inx], aItem) = 0) then begin
Result := Inx;
Exit;
end;
Result := -1;
end;
function TDTListIndexOf(aList : TList; aItem : pointer; aCompare : TtdCompareFunc) : integer;
var Inx : integer;
begin
for Inx := 0 to pred(aList.Count) do
if (aCompare(aList.List^[Inx], aItem) = 0) then Exit(Inx);
Result := -1;
end;
pupsik писал(а):Весьма странно. Т.е. вы заново фпс переписываете или э...э.
SSerge писал(а):2. Зачем в case пустой блок и ветка else? Тоже из тех же соображений, что "неполный if не работает" (С)
SSerge писал(а):Не проверяется, как закрыто окно выбора файлов. В случае отказа через cancel myFileName:= и так далее
sign писал(а):Я вот так бы это написал (не вдаваясь в сам алгоритм, а только выкинув лишние else).
SSerge писал(а):Но, ёпта, повторять это 100500 раз зачем? Сделать свою отдельную процедуру, в которую запихать чтение, не судьба? Не говоря уж о том, что результат чтения - опять не проверяется.
sign писал(а):И что хорошо, можно написать вот так (я так сейчас всегда делаю)
function TDTListIndexOf(aList : TList; aItem : pointer; aCompare : TtdCompareFunc) : integer;
var Inx : integer;
begin
Result := -1;
for Inx := 0 to pred(aList.Count) do
if (aCompare(aList.List^[Inx], aItem) = 0) then Result := Inx;
end;
Лекс Айрин писал(а):Я бы написал так:
Вуаля, куда-то Exit делся. И в случае внесения дополнительных проверок я буду уверен, что неприсвоенного результата не будет.
function TDTListIndexOf(aList : TList; aItem : pointer; aCompare : TtdCompareFunc) : integer;
var Inx : integer;
begin
Result := -1;
inx:=0;
while (aCompare(aList.List^[Inx], aItem) = 0) do
Begin
inx:=inx+1
End;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 230