Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > TForm


Автор: Ragli 4.4.2007, 17:47
Здравствуйте
Вот перед компиляцией на любой форме есть сетка(точки на п всей форме), но после компиляции эта сетка исчезает,как сделать так чтобы на оставалась?
Спасибо

Автор: _hunter 4.4.2007, 17:51
самому рисовать. эта сетка только в design-time'е для удобства разработки рисуется.

Автор: Sunvas 4.4.2007, 18:22
Ragli, А что тебе надо? Чтобы точки на форме были, или чтобы компоненты можно было точно также таскать?
Правильно сказал _hunter, эта сетка для удобства дизайнера, а не программный эффект.

Автор: Snowy 4.4.2007, 18:31
Альтернативный простой вариант:
Код

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Brush.Color := clGrayText;
  Canvas.Brush.Style := bsCross;
  Canvas.Rectangle(ClientRect);
end;


Добавлено через 40 секунд
Это правда не совсем точечки. Просто для точечек несколько больше кода...

Автор: Ragli 4.4.2007, 19:08
Просто мне надо будет мышкой рисовать,и пожэтому по сетке легче ориентироваться

А не подскажешь как можно в ToolBar задать чтоб был только один ряд, просто я перевернул его вертикально,и когда 5-8 кнопок размещаю, то смещается на два ряда вертикальных,как сделать 1 ряд?
Спасибо

Автор: Snowy 4.4.2007, 19:46
Модератор: Пожалуйста, один топик - один вопрос.
Не лепи всё в кучу smile 

Автор: ivan219 4.4.2007, 21:40
Вот тебе и сетачка smile 
Код

procedure TForm1.FormPaint(Sender: TObject);
const
    Step = 4; // Шаг
var
  X, Y: Integer;
begin
 for X:=0 to ClientWidth do
  for Y:=0 to ClientHeight do
   if (X mod Step = 0) and (Y mod Step = 0) then
    Canvas.Pixels[X,Y]:=clBlack;
end;

Автор: ivan219 4.4.2007, 21:57
Хотя вот так новерное будет быстрее.
Код

 for X:=0 to ClientWidth do
  if X mod Step = 0 then
   for Y:=0 to ClientHeight do
    if Y mod Step = 0 then
     Canvas.Pixels[X,Y]:=clBlack;


И ещё один вареант smile 
Код

 X:=0;
 While X<=ClientWidth do
  begin
   Y:=0;
   While Y<=ClientHeight do
    begin
     Canvas.Pixels[X,Y]:=clBlack;
     Inc(Y,Step);
    end;
   Inc(X,Step);
  end;

Через ScanLine
Код

procedure TForm1.FormPaint(Sender: TObject);
const
    Step = 5;
var
  bm: TBitmap;
  X, Y: Integer;
  P: PByteArray;
begin
 bm := TBitmap.Create;
 bm.PixelFormat := pf24bit;
 bm.Width := ClientWidth;
 bm.Height := ClientHeight;
 for Y:=0 to ClientHeight-1 do
  if Y mod Step = 0 then
   begin
    P:=bm.ScanLine[Y];
    for X:=0 to ClientWidth-1 do
     if X mod Step = 0 then
      begin
       p^[x*3] := 0;
       p^[x*3+1] := 0;
       p^[x*3+2] := 0;
      end;
   end;
 Canvas.Draw(0, 0, bm);
 bm.Free;
end;

Автор: Snowy 4.4.2007, 23:03
Все варианты медленные.
Быстрее кисти всё равно несделаешь.
А тем более через ScanLines ;-)

Автор: ivan219 5.4.2007, 00:58
Цитата(Snowy @  4.4.2007,  23:03 Найти цитируемый пост)
Все варианты медленные.Быстрее кисти всё равно несделаешь.А тем более через ScanLines ;-)

А почему?

Автор: Alexeis 5.4.2007, 09:43
ivan219, Не забывай, для работы ScanLine необходим DIB, работа с которым медленнее чем с DDB, потому, что таким образом не используется аппаратное ускорение видеокарты. А для DDB используется.

Автор: Rennigth 5.4.2007, 09:56
Помню ведь было....
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=478684

Автор: Snowy 5.4.2007, 10:27
Rennigth, это ты к чему?

Добавлено через 2 минуты и 41 секунду
А, понял. Промахнулся топиком smile Про сетку ниже.
Но вариант тот же - через ScanLines и достаточно медленный.
От такого кода 433-й пень сдохнет нафиг.

Автор: Yanis 5.4.2007, 10:30
Цитата(Snowy @  5.4.2007,  11:27 Найти цитируемый пост)
Rennigth, это ты к чему?

Он видимо ссылку перепутал. В «арсенале» был код для рисования сетки.
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=496254

Добавлено через 1 минуту и 19 секунд
Цитата(Snowy @  5.4.2007,  11:27 Найти цитируемый пост)
Но вариант тот же - через ScanLines и достаточно медленный.

Где там сканлайн то? В упор не вижу.

Автор: Snowy 5.4.2007, 10:53
Ну да. Это я перехвалил.
Pexels - самый медленный способ. Даже сканлайны в несколько раз быстрее.
Вам так принципиальны именно точки?
Человеку просто разметка нужна была.

Добавлено через 4 минуты и 30 секунд
Хотите точки. Ради бога. Ловите:
Код

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Rectangle(ClientRect);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Brush.Bitmap := TBitmap.Create;
  with Canvas.Brush.Bitmap do
  begin
    Width := 8; Height := 8;
    Canvas.Pixels[7, 7] := clGrayText;
  end;
end;

Автор: Rennigth 5.4.2007, 10:59
Цитата(Yanis @  5.4.2007,  10:30 Найти цитируемый пост)
Он видимо ссылку перепутал. В «арсенале» был код для рисования сетки.

хм, у меня и твоя и моя ссылка ведет на один и тот же топ Draider-а в арсенале...  smile 

Snowy,  тамже FillRect

Автор: Snowy 5.4.2007, 11:17
Цитата(Rennigth @  5.4.2007,  10:59 Найти цитируемый пост)
хм, у меня и твоя и моя ссылка ведет на один и тот же топ Draider-а в арсенале...
Неа. Ты дал линк на топ выше.

Цитата(Rennigth @  5.4.2007,  10:59 Найти цитируемый пост)
тамже FillRect
А, ну да, ну да. Не дочитал...
Просто много ненужного кода. Да и размещать создание и убийство битмапов в отрисовщике нелогично.
Зачем, если он юзается постоянно... Создал и фсё.
Ну собсна, я уже привёл код, как должно быть smile

Автор: Yanis 5.4.2007, 11:48
Предлагаю вариант от джедаев smile
Я в них почему то уверен.
Код
function DesignRectHeight(const ARect: TRect): Integer;
begin
  Result := ARect.Bottom - ARect.Top;
end;

procedure DesignPaintGrid(ACanvas: TCanvas; const ARect: TRect;
  ABackColor, AGridColor: TColor; ADivPixels: Integer);
var
  b: TBitmap;
  I: Integer;
begin
  b := TBitmap.Create;
  try
    b.Height := DesignRectHeight(ARect);
    b.Width := ADivPixels;
    b.Canvas.Brush.Color := ABackColor;
    b.Canvas.FillRect(Rect(0, 0, b.Width, b.Height));

    I := 0;
    repeat
      b.Canvas.Pixels[0, I] := AGridColor;
      Inc(I, ADivPixels);
    until (I >= b.Height);

    I := ARect.Left;
    repeat
      ACanvas.Draw(I, ARect.Top, b);
      Inc(I, ADivPixels);
    until I >= ARect.Right;
  finally
    b.Free;
  end;
end;


И от меня добавка
Код
procedure TForm1.FormPaint(Sender: TObject);
begin
  DesignPaintGrid(Canvas, ClientRect, clNavy, clWhite, 4);
end;

Автор: Snowy 5.4.2007, 12:22
Цитата(Yanis @  5.4.2007,  11:48 Найти цитируемый пост)
Я в них почему то уверен.
А я в них давно разочаровался ;-)
И данный код - лишнее тому подтверждение...

Автор: ivan219 5.4.2007, 12:51
Snowy, Твои два кода которые ты при вёл некоректно работают если менять размер формы в Run-Time то получаем бяку smile

Добавлено через 2 минуты и 36 секунд
И ещё я так и непонял как этот код рисует точки
Код

Procedure TForm1.DrawGrid;
Var
  TmpBmp: TBitmap;
Begin
  TmpBmp := TBitmap.Create;
  Try
    With TmpBmp Do
    Begin
      Width := 8;
      Height := 8;
      Canvas.Brush.Color := clBtnFace;
      Canvas.FillRect(TmpBmp.Canvas.ClipRect);
      Canvas.Pixels[0, 0] := clBlack;
      Canvas.Pixels[0, Height] := clBlack;
      Canvas.Pixels[Width, 0] := clBlack;
      Canvas.Pixels[Width, Height] := clBlack;
    End;
    With Canvas, Brush Do
    Begin
      Bitmap := TBitmap.Create;
      Try
        Bitmap.Assign(TmpBmp);
        Canvas.FillRect(Canvas.ClipRect);
      Finally
        Bitmap.Free;
      End;
    End;
  Finally
    TmpBmp.Free;
  End;
End;

может кто разяснит, распишит по подробнее?

Автор: Snowy 5.4.2007, 13:06
Цитата(ivan219 @  5.4.2007,  12:51 Найти цитируемый пост)
Snowy, Твои два кода которые ты при вёл некоректно работают если менять размер формы в Run-Time то получаем бяку
Выбери в инспекторе OnResize.
Нажми галочку выпадающего списка и выбери Form1Paint ;-)

Автор: ivan219 5.4.2007, 13:47
Цитата(Snowy @  5.4.2007,  13:06 Найти цитируемый пост)
Выбери в инспекторе OnResize.Нажми галочку выпадающего списка и выбери Form1Paint ;-)

Окакая хитрая штука  smile 

Автор: Yanis 5.4.2007, 14:58
Цитата(Snowy @  5.4.2007,  13:22 Найти цитируемый пост)
И данный код - лишнее тому подтверждение... 

А можно узнать, что конкретно не устраивает?

Автор: Snowy 5.4.2007, 15:06
Цитата(Yanis @  5.4.2007,  14:58 Найти цитируемый пост)
А можно узнать, что конкретно не устраивает?
Ну дык. Практически худший код из предложенных.
Если бы писал студент 1-го курса, то да - это 5 - код работает.
Но, с точки зрения практикующего дельфиста - 2 с плюсом. Плюс за то, что он всё таки работает.

Автор: Yanis 5.4.2007, 15:48
Цитата(Snowy @  5.4.2007,  16:06 Найти цитируемый пост)
Практически худший код из предложенных.

Об этом и вопрос. Мне интересно твоё мнение, что именно там плохо.
По моему работает достаточно быстро.

Автор: Snowy 5.4.2007, 16:20
Внешне?
Что быстрее 8000 вызовов SetPixel или один вызов Rectangle?
А при 30 отрисовках в секунду?

Нет, конечно, когда проц за 2 ГГц и других задач нет - только точечки рисовать, то можно и пренебречь такой мелочью, как пара сотен тысяч лишних операций... Главное, чтоб работало  smile
Именно так и рассуждают индийские и китайские программисты smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)