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


Автор: tol 27.5.2006, 16:41
никак ненайду решения одного явления. 

Нужно создать канву для отрисовки изображений переменного 
размера. Беру ScrollBox кладу на него Image, свойство 
Image.Align := alClient 
Теперь если перед тем как что-либо нарисовать на канве 
сначала её увеличить то при прокрутке ScrollBox канва видна вовсём 
своём размере. А если перед увеличением размера что-либо нарисовать и потом увеличить Image то при прокрутке ScrollBox 
видна только часть Image которая вписывалась в размер ScrollBox. 
Какой метод применить что-бы избавиться от этого бага  

Для более ясного представления привожу пример -  smile 

Код

unit Unit1; 

interface 

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

type 
TForm1 = class(TForm) 
ScrollBox1: TScrollBox; 
Image1: TImage; 
Button1: TButton; 
Button2: TButton; 
Button3: TButton; 
procedure Button1Click(Sender: TObject); 
procedure Button2Click(Sender: TObject); 
procedure Button3Click(Sender: TObject); 
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 

var 
Form1: TForm1; 

implementation 

{$R *.dfm} 

//если использовать эту процедуру первой то никаких проблем нет 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
Image1.Width := 300; 
end; 

//а если перед увеличением размера использовать эти процедуры 
//то при прокрутке видна только часть канвы 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
Image1.Canvas.MoveTo(0,50); 
Image1.Canvas.LineTo(300,50); 
Image1.Canvas.MoveTo(100,0); 
Image1.Canvas.LineTo(100,132); 
end; 

procedure TForm1.Button3Click(Sender: TObject); 
begin 
Image1.Canvas.MoveTo(50,0); 
Image1.Canvas.LineTo(40,132); 
end; 

end.
 smile   

Автор: Mechanic 27.5.2006, 17:00
SetBounds  ? 

Автор: tol 27.5.2006, 18:02
Ни какой реакции метод SetBounds не дал smile 

я пробовал добавлять Image1.SetBounds() всё работает как
раньше. То-есть если на канве что-либо нарисовать до увеличения
размера (это когда полосы прокрутки в ScrollBox не проявляются) то при
увеличении длинны Image в  ScrollBox появляются полосы прокрутки, когда
пытаюсь посмотреть скрытую часть канвы то вижу вместо рисунка линии
пустое место smile 
 

Автор: Mechanic 27.5.2006, 18:17
Извини, не дописал. Нужно делать SetBounds() с максимальными размерами.
См. DRKB ("Если отображается только часть TImage"). 

Автор: Snowy 27.5.2006, 18:21
Цитата(tol @  27.5.2006,  16:41 Найти цитируемый пост)
Image.Align := alClient 
Зачем, если ты собираешься устанавливать размеры вручную? 

Автор: tol 27.5.2006, 18:32
конечно можно заранее установить максимальные размеры Image
и непариться,  я этот вариант держу в запасе, тем-немение сам
эфект непонятен почему в одном варианте компонент нормально
отображается , а в другом ненормально . Я пробовал и методы
refresh,repaint,update ничего неполучается smile

Добавлено @ 18:40 
Snowy-- Image.Align := alClient 
 Зачем, если ты собираешься устанавливать размеры вручную? 

Я и этот вариант прорабатывал  smile  , и при  Image.Align := alNone
баг не исчезает 

Автор: Демо 27.5.2006, 18:46
Цитата(tol @  27.5.2006,  18:32 Найти цитируемый пост)
баг не исчезает 


Не баг, а проблема ;) 

Автор: Mechanic 28.5.2006, 14:19
Что я делаю не так?  smile 

 

Автор: tol 28.5.2006, 23:54
Всё так smile 
Спасибо за пример smile  сейчас вижу решение - с увеличением Image канву так-же 
надо увеличивать пропорционально компоненту. smile  

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