Конференция "Media" » Ошибка у Canvas'а [D7, WinXP]
 
  • Пётр (23.03.08 16:12) [0]
  • Efir (23.03.08 18:34) [1]
    Чё за Image1.
    Предположение, возможно не созданный, но объявленный TImage.
  • Пётр (23.03.08 18:55) [2]
    Image1 создан ещё на этапе проектирования, он точно существует. Ещё один баг: пока я не прописал OnCreate у формы Image1.Canvas.Create;, он и к канвасу обратиться не мог. С brush'ем такой номер не проходит.
  • Пётр (23.03.08 19:03) [3]
    Причём ошибка эта появляется "по настроению", только при каких-то загадочных обстоятельствах запуска программы
  • @!!ex © (23.03.08 19:38) [4]
    У меня
    Image1.Canvas.Brush.Color:=clBlack;
    нормально отрабатывает.

    Ошибка в 17 строке однозначно.


    > Ещё один баг: пока я не прописал OnCreate у формы Image1.Canvas.Create;
    > , он и к канвасу обратиться не мог. С brush'ем такой номер
    > не проходит.

    Можно посмотреть на сорцы этого чуда???
  • Пётр (23.03.08 20:13) [5]
    вот вам весь юнит, цените)

    unit prizm;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, ComCtrls, ExtCtrls;

    type
     TfrmPrizm = class(TForm)
       Image1: TImage;
       Edit1: TEdit;
       UpDown1: TUpDown;
       Label1: TLabel;
       Button1: TButton;
       Button2: TButton;
       Label2: TLabel;
       Edit2: TEdit;
       UpDown2: TUpDown;
       procedure FormShow(Sender: TObject);
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
       procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);
       procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
         Y: Integer);
       procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);
       procedure FormClose(Sender: TObject; var Action: TCloseAction);
       procedure FormCreate(Sender: TObject);
       procedure Edit1KeyPress(Sender: TObject; var Key: Char);
     private
       { Private declarations }
     public
       { Public declarations }
       procedure Paint1(Sender: TObject);
     end;

    var
     frmPrizm: TfrmPrizm;
     Points: array of TPoint;
     Coord: array of array [0..1] of extended;
     down, adding: boolean;
     cur: integer;
     m: extended;

    implementation

    uses add, edit, main;

    {$R *.dfm}

    procedure TfrmPrizm.FormShow(Sender: TObject);
    var i: integer;
    begin
     if adding
     then
      begin
       Edit1.Text:='3';
       Edit2.Text:='1';
       SetLength(coord, 0);
       SetLength(points, 0);
       SetLength(Points, 3);
       SetLength(Coord, 3);
       m:=1;
       for i:=0 to 3 do
         begin
           Coord[i][0]:=cos(2/3*pi*i);
           Coord[i][1]:=sin(2/3*pi*i);
           Points[i]:=Point(round(320+50*coord[i][0]), round(240-50*coord[i][1]));
         end;
       adding:=false;
      end
     else
       begin
         for i:=0 to length(coord)-1 do
           Points[i]:=Point(round(320+50*coord[i][0]/m), round(240-50*coord[i][1]/m));
         Edit1.Text:=IntToStr(length(coord));
       end;
     Paint1(Sender);
    end;

    procedure TfrmPrizm.Button1Click(Sender: TObject);
    begin
     frmPrizm.Close;
    end;

    procedure TfrmPrizm.Button2Click(Sender: TObject);
    var i: integer;
    begin
     m:=StrToFloat(Edit2.Text);
     SetLength(Coord, StrToInt(Edit1.Text));
     SetLength(Points, StrToInt(Edit1.Text));
     for i:=0 to StrToInt(Edit1.Text) do
       begin
         Coord[i][0]:=m*cos(pi*2*i/StrToInt(Edit1.Text));
         Coord[i][1]:=m*sin(pi*2*i/StrToInt(Edit1.Text));
         Points[i]:=Point(round(320+50*coord[i][0]/m), round(240-50*coord[i][1]/m));
       end;
     Paint1(Sender);
    end;

    procedure TfrmPrizm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    var i: integer;
    begin
     for i:=0 to Length(coord)-1 do
       if (x>round(320+50*coord[i][0]/m-3))
       and(x<round(320+50*coord[i][0]/m+3))
       and(y>round(240-50*coord[i][1]/m-3))
       and(y<round(240-50*coord[i][1]/m+3)) then
         begin
           cur:=i;
           down:=true;
         end;
    end;

    procedure TfrmPrizm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
    begin
     if down then
       begin
         coord[cur][0]:=m*(x-320)/50;
         coord[cur][1]:=m*(240-y)/50;
         points[cur]:=point(round(320+50*coord[cur][0]/m), round(240-50*coord[cur][1]/m));
         Paint1(Sender);
       end;
    end;

    procedure TfrmPrizm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    begin
     down:=false;
     Paint1(Sender);
    end;

    procedure TfrmPrizm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     if length(coord)>0 then frmAdd.Button7.Enabled:=true;
    end;

    procedure TfrmPrizm.Paint1(Sender: TObject);
    var i: integer;
    begin
     PatBlt(Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, WHITENESS);
     Image1.Canvas.Brush.Color:=clBlack;
     with Image1.Canvas do
       begin
         Polygon(Points);
         Pen.Color:=clLime;
         MoveTo(320, 0);
         LineTo(320, 480);
         MoveTo(0, 240);
         LineTo(640, 240);
         MoveTo(318, 190);
         LineTo(322, 190);
         MoveTo(370, 238);
         LineTo(370, 242);
         Brush.Color:=clWhite;
         TextOut(323, 190, FloatToStrf(m, fffixed, 10, 1));
         TextOut(370, 243, FloatToStrf(m, fffixed, 10, 1));
         Pen.Color:=clBlack;
         Brush.Color:=clBlack;
         Polygon(points);
         Brush.Color:=clLime;
       end;
     for i:=0 to length(coord)-1 do
       Image1.Canvas.Rectangle(round(320+50*coord[i][0]/m)-3, round(240-50*coord[i][1]/m)-3,
        round(320+50*coord[i][0]/m)+3, round(240-50*coord[i][1]/m)+3);
     Image1.Canvas.Brush.Color:=clWhite;
    end;

    procedure TfrmPrizm.FormCreate(Sender: TObject);
    begin
     adding:=false;
     m:=1;
     Image1.Canvas.Create;
    end;

    procedure TfrmPrizm.Edit1KeyPress(Sender: TObject; var Key: Char);
    var
     s: string; edit: TEdit;
    begin
     edit:=Sender as TEdit;
     case Key of
     '0'..'9':;
     #8: if length(edit.Text)<2 then Key:=#0;
     ',':
       begin
         s:=edit.Text;
         if (pos (',', s)<>0)or(edit.SelStart=0)or(edit=Edit1) then Key:=#0;
       end;
      else Key:=#0;
      end;
    end;

    end.

  • Сергей М. © (23.03.08 20:37) [6]
    Т.е. ты "запустил" свою программулину и тут же получил исключение, не успев даже глазом моргнуть ?
  • antonn © (24.03.08 00:43) [7]

    > Image1.Canvas.Create;

    :)
  • @!!ex © (24.03.08 08:30) [8]
    > [7] antonn ©   (24.03.08 00:43)

    Да, да. Поэтому и попросил автора выложить сорсы... примерно такого и ожидал. :))

    Автор, вы в курсе, как работают конструкторы в Delphi?
  • Пётр (24.03.08 16:33) [9]
    я в курсе, что так насмешившая вас строка обычно не нужна, но в этой программе постоянно шла ошибка, пока я её не прописал. А форма эта вспомогательная, и ошибка выходит при её открытии
  • @!!ex © (24.03.08 16:42) [10]
    > я в курсе, что так насмешившая вас строка обычно не нужна,

    Она не обычно не нужна.
    Это в корне не правильная строка.
  • Пётр (24.03.08 19:32) [11]
    но она помогла)
    да вобщем-то проект я уже сдал, и эта ошибка в этот раз не появилась и не помешала занять 1 место в лицее)
    надеюсь, в будущем такие чудеса происходить не будут, ответ на топик больше не нужен.
  • @!!ex © (24.03.08 19:45) [12]
    > но она помогла)

    У меня есть машина без руля, я прикрутил руль, но он отвалился и заклинил положение колес, но по случайности заклинило в идеально ровном положении, а т.к. ездить надо на другой конец улицы по ровной дороги - это помогло.
 
Конференция "Media" » Ошибка у Canvas'а [D7, WinXP]
Есть новые Нет новых   [133928   +471][b:0][p:0.004]