Модератор: Модераторы
Сквозняк писал(а):В последней версии 2.0.4 версии лазаруса для win64 writeln('12345 йцукен'); пытается в файл залезть и вызывает ошибку.
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
{$IFDEF WINDOWS}
Windows, {for setconsoleoutputcp}
{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
ErrorMsg, s: String;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h', 'help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h', 'help') then begin
WriteHelp;
Terminate;
Exit;
end;
{ add your program here }
SetConsoleOutputCP(CP_UTF8);
writeln('12345 йцукен');
readln(s);
// stop program loop
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
procedure TMyApplication.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ', ExeName, ' -h');
end;
var
Application: TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
Vadim писал(а):Сквозняк писал(а):В последней версии 2.0.4 версии лазаруса для win64 writeln('12345 йцукен'); пытается в файл залезть и вызывает ошибку.
Вы сначала уточните: у Вас тут речь идёт о консольном или о GUI приложении. А то разговор уже приобретает характер сломанного телефона...
Снег Север писал(а):
- Код: Выделить всё
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
{$IFDEF WINDOWS}
Windows, {for setconsoleoutputcp}
{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
ErrorMsg, s: String;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h', 'help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h', 'help') then begin
WriteHelp;
Terminate;
Exit;
end;
{ add your program here }
SetConsoleOutputCP(CP_UTF8);
writeln('12345 йцукен');
readln(s);
// stop program loop
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
procedure TMyApplication.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ', ExeName, ' -h');
end;
var
Application: TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
Что я делаю не так?
Сквозняк писал(а):Из окошка, из буттонклик вриттелн отправить. И скомпилировать так, как лазарус по умолчанию компилирует. Тогда и будет ошибка. Раньше, на вин32 этого бага не было.
Сквозняк писал(а):Для простого посылания сообщения разводишь конструкторы-деструкторы, класс создаёшь, подтягиваешь кучу зависимостей. У writeln в документации таких условий для применения нет.
Vadim писал(а):Сквозняк писал(а):Из окошка, из буттонклик вриттелн отправить. И скомпилировать так, как лазарус по умолчанию компилирует. Тогда и будет ошибка. Раньше, на вин32 этого бага не было.
Из оконного приложения такое было всегда. Вне зависимости от битности. Вы ничего не путаете? Другое дело, если Вы пишете консольное приложение. В нём этот самый "файл" для вывода в консоль создаётся автоматически. В окошечном его нет и никогда не было. Так что абсолютно ничего не изменилось и не испортилось.
procedure Writeln( Args: Arguments);
procedure WriteLn( var F: Text; Args: Arguments);
Снег Север писал(а):Сквозняк писал(а):Для простого посылания сообщения разводишь конструкторы-деструкторы, класс создаёшь, подтягиваешь кучу зависимостей. У writeln в документации таких условий для применения нет.
Я просто делаю правильно. А если кто привык к халтуре, то он сам себе злобный буратино.
Сквозняк писал(а):Ты не по документации делаешь а тупо лепишь побольше хаков
Сквозняк писал(а):Не всегда так работает. В линуксе ошибки нет.
Снег Север писал(а):Сквозняк писал(а):Ты не по документации делаешь а тупо лепишь побольше хаков
Ну что за бред... Чтобы ты знал, это - дефолтный шаблон консольного приложения лазаря, который создается для нового проекта. В который я добавил ровно две строчки.
Т.е. это пример как правильно от самих разработчиков.
А проблемы рукожопых красноглазиков никого не волнуют.
Добавлено спустя 10 минут 20 секунд:
ЗЫ. Разработчики дают пример правильного конструирования кроссплатформенных приложений. Именно для того, чтобы всё работало строго одинаково под разными системами. А кто воображает, что "по документации" всё должно работать одинаково святым духом, тот э-э-э... не совсем гений...
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
writeln('12345 йцукен');
end;
end.
#сборка без бага при выполнении Writeln
rm *.o
rm *.ppu
rm *.obj
wine cmd.exe /c "C:lazarus-2.0.4-fpc-3.0.4-win64fpc3.0.4binx86_64-win64fpc.exe -FuC:lazarus-2.0.4-fpc-3.0.4-win64lclunitsx86_64-win64win32 -FuC:lazarus-2.0.4-fpc-3.0.4-win64lclunitsx86_64-win64 -FuC:lazarus-2.0.4-fpc-3.0.4-win64componentslazutilslibx86_64-win64 -FuC:lazarus-2.0.4-fpc-3.0.4-win64packagerunitsx86_64-win64 -dLCL -dLCLwin32 project1.lpr"
Vadim писал(а):Сквозняк писал(а):Не всегда так работает. В линуксе ошибки нет.
Вы не можете ничего понять по той причине, что путаете понятия.Говорить то начали о винде, а тут вдруг раз, и ни с того ни с сего Линукс выполз. С чего это, интересно...
![]()
Да, сравнить их соблазнительно, но неправильно. Вам не приходило в голову, что несмотря на одинаковое название (writeln) реализация в разных ОС может быть разная?
Сквозняк писал(а):Если путаются, то это баг.
Сквозняк писал(а): Если путаются, то это баг.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4