Модератор: Модераторы

Сквозняк писал(а):В последней версии 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) реализация в разных ОС может быть разная?
Сквозняк писал(а):Если путаются, то это баг.
 Есть же багтрекер. Вы, конечно, можете считать правым исключительно себя, но в винде подобный "баг" был всегда. Причём и в Lazarus и в Delphi. Поэтому забивание именно тут эфира своим гневом по этому поводу - занятие, мягко говоря, бессмысленное. Просто добъётесь того, что на Ваши вопросы никто отвечать не будет.
 Есть же багтрекер. Вы, конечно, можете считать правым исключительно себя, но в винде подобный "баг" был всегда. Причём и в Lazarus и в Delphi. Поэтому забивание именно тут эфира своим гневом по этому поводу - занятие, мягко говоря, бессмысленное. Просто добъётесь того, что на Ваши вопросы никто отвечать не будет. 

Сквозняк писал(а): Если путаются, то это баг.

Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1