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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 09:28   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию TScrollBar неправильно отображает ползунок

Здравствуйте.
Возникла очень тривиальная проблема. Даже представить не мог, что с такой простой задачей могут быть затупы.
устанавливаю начальные значения:
Код:
  ScrollBar1.Min := 0;
  ScrollBar1.Max := 1024;
  ScrollBar1.SmallChange := 16;
высота скроллбара и его LargeChange должны зависеть от высоты Panel1, значит делаем:
Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  Panel1.Height := Height - Panel1.Top - 70;
  ScrollBar1.Top := Panel1.Top;
  ScrollBar1.Height := Panel1.Height;
  ScrollBar1.Left := Panel1.Width + Panel1.Left + 6;
  ScrollBar1.LargeChange := Panel1.Height div (fontHeight + 2);
end;
но при ресайзе скроллбара, реальный размер его ползунка получается меньше визуального размера ползунка.
не пойму, что еще нужно сделать?

Последний раз редактировалось BLACK_RAIN; 25.11.2015 в 09:31.
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.11.2015, 09:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Как LargeChange связан с размером ползунка?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.11.2015, 10:05   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Как LargeChange связан с размером ползунка?
в каком смысле? Так и связан. LargeChange это размер прыжка. Реальный ползунок получается меньше отображаемого. Не пойму, как исправить.
p.s. Вот вся тестовая прога:
[spoiler]
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ScrollBar1: TScrollBar;
    panel1: TImage;
    procedure ScrollBar1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bmp : TBitmap;

implementation

{$R *.dfm}

procedure TForm1.ScrollBar1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  If Key= vk_return then Close;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Panel1.Height := Height - Panel1.Top - 70;
  ScrollBar1.Top := Panel1.Top;
  ScrollBar1.Height := Panel1.Height;
  ScrollBar1.Left := Panel1.Width + Panel1.Left + 6;
  bmp.Height := panel1.Height;
  bmp.Width := panel1.Width;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  panel1.Top := 20;
  Panel1.Left := 0;
  ScrollBar1.Min := 0;
  ScrollBar1.Max := 1024;
  ScrollBar1.SmallChange := 1;
  bmp := TBitmap.Create;
  bmp.Canvas.Font.Name := 'Lucida Console';
  bmp.Canvas.Font.Size := 20;
  bmp.Canvas.Font.Color := clRed;
  bmp.Canvas.Brush.Color := clBlack;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  i,j,n,x : SmallInt;
begin
  bmp.Canvas.FillRect(bmp.Canvas.ClipRect);
  n := bmp.Canvas.TextHeight('X')+4;
  j := bmp.Height div n;
  ScrollBar1.LargeChange := j;
//  Caption := IntToStr(j);
  x := 0;
  for i:= 0 to j-1 do
  begin
    bmp.Canvas.TextOut(0,x, IntToStr(i+ ScrollBar1.Position+1));
    inc(x,n);
    Application.ProcessMessages;
  end;
  panel1.Picture.Bitmap.Assign(bmp);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.Free;
end;

end.
[/spoiler]

Последний раз редактировалось BLACK_RAIN; 25.11.2015 в 10:10.
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.11.2015, 10:08   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
в каком смысле
В прямом - как размер ползунка зависит от LargeChange?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 08:03   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В прямом - как размер ползунка зависит от LargeChange?
Потому что LargeChange меняется в зависимости от высоты панели. Чем больше высота, тем больше должен быть сам ползунок и его LargeChange. Еще на размер ползунка должна влиять высота скроллбара. В общем, как список файлов в explorer'е. Да зачем далеко ходить - TListBox - вот пример того, как мне нужно сделать. Только взять отдельный TScrollBar и связать его с высотой панели и числом Max. У меня всё получается, но размер ползунка отображается неправильно. Если не изменять высоту скроллбара в OnResize(), то всё нормально.
код я выложил. Скажите, что не так, пожалуйста.

блин, кажется разобрался. Это просто баг отрисовки. Когда скроллбар и ползунок меняют размер, то та фигнюшка, которая мигает на ползунке, свой размер не меняет и продолжает мигать на старом месте Блин, два дня на это убил! Думал, это я что-то не так делаю!
p.s. Что сделать, чтобы скроллбар не приобретал фокус, когда его юзаешь?

Вчера решил не изобретать велосипед и переписал проект на WinAPI. Там, как оказалось, скроллбар пишется элементарно и без постоянно вылетающих ошибок и непонятно откуда берущейся рекурсии.
А с этим VCL безрезультатно возился два дня.

Последний раз редактировалось Stilet; 27.11.2015 в 10:01.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять почему в phpmyadmin неправильно отображает кирилицу Illusiony PHP 1 25.10.2015 22:54
Проблема с TScrollBar. Графический векторный редактор. savva-paladin Помощь студентам 0 28.01.2014 16:11
Мozilla неправильно отображает мою страничку. Html Екатерина_21 HTML и CSS 5 04.08.2011 21:05
Визуальное изменение компонента TScrollBar SanekIrk Общие вопросы Delphi 5 17.10.2008 14:19
Controls in TScrollBar akasex Общие вопросы Delphi 7 13.05.2008 21:35