Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

При изменении размеров формы пропадает панель   Найти похожие ветки 

 
Light-blr   (2007-02-07 17:41) [0]

Здравствуйте.
У меня на форме панель с положением AlBottom и Image на всём остальном пространстве (ширина по Form.ClientWidth, высота как Form.ClientHeight-Panel.Height, положение AlTop). Размеры формы могут изменяться, на OnResize я поставила просто изменение высоты Image (ширина Image и панели изменяется автоматически, а высота панели не меняется).
Так вот, если раздвигать форму стрелочками, то всё отлично. А если раздвигать кнопкой (которая в верхнем правом углу), а потом сдвигать обратно (той же кнопкой), то панель становится не видна (остаётся как бы на том же месте, что в развёрнутом состоянии, но это уже за пределами формы). А если после этого начать снова двигать размеры формы стрелочками, она появляется.
Кто-нибудь может сказать, в чём здесь дело? Как заставить панель появиться там где надо, при том что ClientHeight, как ему и положено, изменяется вовремя, высота панели вообще не меняется, а кнопок прокрутки на форме не появляется?


 
RASkov   (2007-02-07 18:13) [1]

Panel.Align:=alBottom;
Image.Align:=alClient;


 
RASkov   (2007-02-07 18:14) [2]

И не надо ничего на OnResize


 
Light-blr   (2007-02-07 18:25) [3]

Если делать AlClient, то Image оказывается под панелью, а мне надо чтобы они стыковались (в перспективе хочу ещё полосу прокрутки сделать). И это всё равно не решает поставленную проблему...


 
Light-blr   (2007-02-07 18:28) [4]

Проверила, исправляюсь, под панелью Image не оказывается, но вот под полосой прокрутки - да.


 
RASkov   (2007-02-07 18:50) [5]

> [4] Light-blr   (07.02.07 18:28)


> в перспективе хочу ещё полосу прокрутки сделать)

Что такое "полоса прокрутки"? И что она прокручивает?


 
Light-blr   (2007-02-07 19:06) [6]

Полоса прокрутки, которая ScrollBar.
Будет прокручивать Image (если влезла не вся картинка - можно будет прокрутить). Я долго пыталась найти собственную прокрутку у Image, но не нашла... А она есть? Тогда мне больше ничего не надо :)


 
Германн ©   (2007-02-07 19:24) [7]


> Я долго пыталась найти собственную прокрутку у Image, но
> не нашла... А она есть? Тогда мне больше ничего не надо
> :)

Есть ScrollBox


 
RASkov   (2007-02-07 21:03) [8]

> [6] Light-blr   (07.02.07 19:06)

Вот форма:
object Form1: TForm1
 Left = 192
 Top = 114
 Width = 870
 Height = 640
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Image1: TImage
   Left = 0
   Top = 0
   Width = 845
   Height = 548
   Align = alClient
 end
 object Panel1: TPanel
   Left = 0
   Top = 565
   Width = 862
   Height = 41
   Align = alBottom
   Caption = "Panel1"
   TabOrder = 0
 end
 object ScrollBar1: TScrollBar
   Left = 0
   Top = 548
   Width = 862
   Height = 17
   Align = alBottom
   PageSize = 0
   TabOrder = 1
 end
 object ScrollBar2: TScrollBar
   Left = 845
   Top = 0
   Width = 17
   Height = 548
   Align = alRight
   Kind = sbVertical
   PageSize = 0
   TabOrder = 2
 end
end

А прокрутку придумала?


 
Light-blr   (2007-02-07 21:37) [9]

ScrollBox меня не удовлетворяет, к сожалению (первым делом его пыталась использовать). Дело в том, что в Image загружаются картинки, а на форме после этого рисуются квадратики (MoveTo-LineTo). Они видны над картинкой, что мне и надо. А в ScrollBox-е нет Canvas (как и на панели). Или я просто не знаю, как его там найти.
Поэтому мне нужен ScrollBar, сама все события реализую. Так, как мне надо.

Панель действительно перестала пропадать, когда я поставила в Image alClient. Только так и не поняла, почему это так.


 
Германн ©   (2007-02-08 01:31) [10]


> Light-blr   (07.02.07 21:37) [9]
>
> ScrollBox меня не удовлетворяет, к сожалению (первым делом
> его пыталась использовать). Дело в том, что в Image загружаются
> картинки, а на форме после этого рисуются квадратики (MoveTo-
> LineTo). Они видны над картинкой, что мне и надо. А в ScrollBox-
> е нет Canvas (как и на панели). Или я просто не знаю, как
> его там найти.

А, имхо, не там ищешь! И не там рисуешь и не так рисуешь!
Может сможешь изложить тут не проблему, а саму задачу?
Моя 5-я точка чует, что эту задачу нужно решать через другие органы :)


 
RASkov   (2007-02-08 07:07) [11]

> А в ScrollBox-е нет Canvas (как и на панели).

Держи канву для панели и для скролбокса:
type
 TMyPanel = class(TPanel)
 public
   property Canvas;
 end;
 TPanel = class(TMyPanel);

 TForm1 = class(TForm)
   ScrollBox1: TScrollBox;
   Panel1: TPanel;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Cnvs: TControlCanvas;
begin
 Panel1.Canvas.Ellipse(10, 10, 30, 30);
 Cnvs:=TControlCanvas.Create;
 Cnvs.Control:=ScrollBox1;
 Cnvs.Brush:=Brush;
 Cnvs.Rectangle(10, 10, 30, 30);
 Cnvs.Free;
end;


 
MsGuns ©   (2007-02-08 09:21) [12]

Если элементы интерфейса плохо графически выравниваются друг относительно друга, следует использовать доп. групповые контейнеры (панели, групбоксы), кторые уже прекрасно умеюют выравниваться друг относительно друга ;)


 
TRUNK ©   (2007-02-08 10:31) [13]


> Light-blr   (07.02.07 21:37) [9]
> А в ScrollBox-е нет Canvas

Поставь Image на ScrollBox, и установи свойство Image.Align=alClient.


 
Light-blr   (2007-02-08 15:12) [14]

Германн
В самом общем виде: есть картинка, из которой надо сделать схему (типа как картины для вышивки). Для этого на картинку должна наложиться сетка, которую пользователь может сам закрашивать. Когда в Image загружена картинка, на ней нельзя рисовать (выскакивает ошибка, что нельзя использовать Canvas). Если поверх положить другой Image, то он мне затрёт картинку, потому что когда обращаешься к его канве, он первым делом заливает её фоновым цветом, а на этом цвете уже рисует.
Поэтому единственный вариант, который я нашла - рисовать по форме, на которой лежит Image. Спасибо товарищу RASkovу за канву для скроллбокса, одной проблемой станет меньше.


 
RASkov   (2007-02-08 20:27) [15]

> Когда в Image загружена картинка, на ней нельзя рисовать
> (выскакивает ошибка, что нельзя использовать Canvas).

Ну это потому, что картинка форматом отличная от BitMap

> Поэтому единственный вариант, который я нашла - рисовать
> по форме, на которой лежит Image.

Преобразуй Picture в Image к BitMap"у и рисуй на нем...

> он первым делом заливает её фоновым цветом, а на этом цвете
> уже рисует.

Style:=bsClear;

procedure TForm1.Button2Click(Sender: TObject);
var N, J: Integer;
BMP: TBitMap;
begin
 BMP:=TBitMap.Create;
 try
 BMP.Assign(Image1.Picture.Graphic);
 Image1.Picture.Assign(BMP);
 Image1.Canvas.Brush.Style:=bsClear;
 for N:= 0 to Image1.Width do
  for J:= 0 to Image1.Height do begin
   if (N mod 10=0) and (J mod 10=0) then begin
    if CheckBoxFill.Checked then Image1.Canvas.Brush.Color:=Image1.Canvas.Pixels[N+5, J+5];
    Image1.Canvas.Rectangle(N, J, N+9, J+9);
    end;
  end;
 finally BMP.Free; end;
end;


 
RASkov   (2007-02-08 20:29) [16]

> > он первым делом заливает её фоновым цветом, а на этом
> цвете
> > уже рисует.
>
> Style:=bsClear;

Image1.Canvas.Brush.Style:=bsClear;



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
15-1170320275
McSimm
2007-02-01 11:57
2007.02.25
Операционные системы. Разработка и реализация (+СD). 3-е изд.


2-1170752418
Medved_
2007-02-06 12:00
2007.02.25
MDI


2-1170522645
Defort
2007-02-03 20:10
2007.02.25
Пусто или же не пусто?


15-1170440145
_uw_
2007-02-02 21:15
2007.02.25
О Картинках


2-1170852927
Рустам
2007-02-07 15:55
2007.02.25
Обновления в базе