Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2011, 20:53   #1
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию Canvas формы

Здравствуйте. Пишу компонент наследуя TScrollingWinControl, добавляя канву, точно так же как это делает класс TForm.
Этот компонет использую для размещения панелек и их перемещения по этому компонету. Хочу сделать выделение панелек, для этого использую канву, свой компонет показывать не буду, чтобы не напрягать, покажу код при помощи события OnPaint формы:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin
  with Canvas do
  begin
    // Очистка канвы
    Brush.Style := bsSolid;
    Brush.Color := clSilver;
    FillRect(ClientRect);

    // Рисование параллельной линии над панелью
    MoveTo(Panel1.Left, Panel1.Top - 2);
    LineTo(Panel1.Left + Panel1.Width, Panel1.Top - 2);
  end;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  // Перемещение панели
  ReleaseCapture;
  Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
end;

end.
Но код, который очищает и рисует линию сверху от панельки (которые паралельны верху панели) не очищает нарисованные до этого линии (контур панелек). Хотелось бы узнать что в этом коде не так и как необходимо реализовывать рисование контура вокруг панели (то есть очистку).
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 23.08.2011 в 21:22.
chertovich вне форума Ответить с цитированием
Старый 23.08.2011, 21:14   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
Но код, который при перемещении панельки линии не очищаются.
Хоть что-то из этого предложения кто-то понять может?
Прик вне форума Ответить с цитированием
Старый 23.08.2011, 21:22   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

при перемещение формы получается ещё линии?
bulldog5293 вне форума Ответить с цитированием
Старый 23.08.2011, 21:28   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от bulldog5293 Посмотреть сообщение
при перемещение формы получается ещё линии?
При перемещении панели, линии на канве формы.
А должна быть одна линия сверху панели.
Изображения
Тип файла: jpg 1.jpg (40.1 Кб, 82 просмотров)
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 23.08.2011, 21:47   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Эти линии и получаются, если их чертить:
Код:
    // Рисование параллельной линии над панелью
//    MoveTo(Panel1.Left, Panel1.Top - 2);
//    LineTo(Panel1.Left + Panel1.Width, Panel1.Top - 2);
Прик вне форума Ответить с цитированием
Старый 23.08.2011, 21:50   #6
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Эти линии и получаются, если их чертить:
Код:
    // Рисование параллельной линии над панелью
    MoveTo(Panel1.Left, Panel1.Top - 2);
    LineTo(Panel1.Left + Panel1.Width, Panel1.Top - 2);
1. При каждой перерисовки я очищаю канву
2. Этот код для чертижа одной линии сверху панели
И получается, что код для очистки канвы не работает, вот я хочу узнать почему и как это устранить
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 23.08.2011, 22:03   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

И где эта перерисовка наблюдается?
Сделайте хотя бы элементарные телодвижения:
Код:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  // Перемещение панели
  ReleaseCapture;
  Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
  Invalidate;
end;
Ну разве можно двигать объекты по форме этаким кодом... Где слямзили?
Впрочем, какая разница - надо бы автору поискать как это делается нормально - примеров море.
Прик вне форума Ответить с цитированием
Старый 23.08.2011, 22:10   #8
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Спасибо, так по лучше но не совсем так как хотелосьбы. Приведите пожауйста примерчик нормального, на ваш взгляд, перемещения панели
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 23.08.2011, 22:54   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Странно. Была наводка: "примеров море".
Как вариант:
Panel1MouseDown - запоминаем координаты мышиного курсора (saveX, saveY : Integer или savePt : TPoint);
Panel1MouseMove - сдвигаем панель на Panel1.Left := Panel1.Left + X - saveX (не забывая и вертикальную составляющую);
Panel1MouseUp - сброс savePt (saveX, saveY).
saveX, saveY, savePt - имена нарицательные и могут быть заменены на любые другие по вкусу.
Прик вне форума Ответить с цитированием
Старый 23.08.2011, 23:25   #10
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Странно. Была наводка: "примеров море".
Как вариант:
Panel1MouseDown - запоминаем координаты мышиного курсора (saveX, saveY : Integer или savePt : TPoint);
Panel1MouseMove - сдвигаем панель на Panel1.Left := Panel1.Left + X - saveX (не забывая и вертикальную составляющую);
Panel1MouseUp - сброс savePt (saveX, saveY).
saveX, saveY, savePt - имена нарицательные и могут быть заменены на любые другие по вкусу.
Такой алгоритм мне не подходит, в нем есть недостатаки. Так и думал что мне предложат эту реализацию, ничего нового и полезного я не увидел.
Может попытаетесь еще, вы же сами сказали что "море вариантов"
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реакция на наведение указателя на участок формы. Canvas skalt12 Общие вопросы Delphi 4 11.08.2010 13:09
Заголовок Child формы имеет цвет неактивной формы, хотя форма активна? PrimaryPro Общие вопросы Delphi 0 12.03.2010 11:12
как привязать размеры содержимого формы к размерам самой формы acid_bmstu Общие вопросы Delphi 4 05.02.2010 05:02
Обращение из формы в dll к элементу главной формы (delphi) a_n_n_a Помощь студентам 3 10.05.2009 04:00
Canvas (Канва) - заливка фигуры произвольной формы Albenous Общие вопросы Delphi 13 24.02.2007 13:21