Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];
ВнизХм, а как запуздырить иконку в StatusBar? Найти похожие ветки
← →
Kolan © (2008-01-16 14:45) [0]Пробовал так:
procedure TMainForm.DrawCalendarIconInStatusBar(AStatusBar: TStatusBar;
AImageList: TImageList; AImageIndex: Integer);
begin
if Assigned(AStatusBar) and Assigned(AImageList) then
begin
AImageList.Draw(AStatusBar.Canvas, 2, 2, AImageIndex);
end;
end;
не видно ничего…
← →
Palladin © (2008-01-16 15:11) [1]дык рисование то нужно делать на tstatusbar.ondrawpanel и ей (панели) еще ко всему прочему нужно выставить Style:=psOwnerDraw
← →
Kolan © (2008-01-16 15:13) [2]угу, шас попробую…
← →
Kolan © (2008-01-16 15:21) [3]Так:
procedure TMainForm.DrawIconOnStatusBar(AStatusBar: TStatusBar;
AImageList: TImageList; AImageIndex: Integer; AnOffset: TPoint);
begin
if Assigned(AStatusBar) and Assigned(AImageList) then
begin
AImageList.Draw(AStatusBar.Canvas, AnOffset.X, AnOffset.Y, AImageIndex);
end;
end;
procedure TMainForm.StatusBarDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
DrawIconOnStatusBar(StatusBar, MainMenuImageList, 13, Point(4, 4));
StatusBar.Canvas.TextOut(Rect.Left+4+16, Rect.Top+3, Panel.Text);
end;
Не видно иконки :(
← →
Palladin © (2008-01-16 15:29) [4]ну млин... у меня все рисует... и что значит поинт(4,4) тебе Рект передается для рисования... индекс панели тоже учитывай, тебе Панел передается, а может и картинки то с таким номером нет
← →
ПостОвый терминатор © (2008-01-16 15:37) [5]
procedure TForm1.FormCreate(Sender: TObject);
begin
with Image1 do
begin
Parent := StatusBar1;
Top := 5;
Left := 2;
end;
end;
← →
Kolan © (2008-01-16 15:45) [6]> тебе Рект передается для рисования
Забыл. :Работает :) А клик по этой панели поймать низя? В инспекторе у нее вообще нет событий…
← →
Palladin © (2008-01-16 15:46) [7]
> [5] ПостОвый терминатор © (16.01.08 15:37)
казалось бы причем тут image1
> [6] Kolan © (16.01.08 15:45)
по панели нельзя... придется ловить по статусбару и немножечко считать...
← →
Kolan © (2008-01-16 15:59) [8]> немножечко считать…
procedure TMainForm.StatusBarDblClick(Sender: TObject);
var
CursorPos: TPoint;
begin
if Sender is TStatusBar then
with Sender as TStatusBar do
begin
if GetCursorPos(CursorPos) then
begin
if (Panels.Count >= 2)
and ((CursorPos.X > Panels[0].Width) and (CursorPos.X < Panels[0].Width + Panels[1].Width ))
then
CreatePeriodAction.Execute;
end;
end;
end;
Как-то так? Толкьо блин с координатами не пойму как правильно разобраться…
← →
Palladin © (2008-01-16 16:03) [9]
procedure TForm1.StatusBar1Click(Sender: TObject);
Var
p:TPoint;
i:Integer;
x:Integer;
begin
p:=StatusBar1.ScreenToClient(Mouse.CursorPos);
x:=0;
For i:=0 to StatusBar1.Panels.Count-1 Do
Begin
Inc(x,StatusBar1.Panels[i].Width);
If x>p.X Then
Begin
ShowMessage("подомной панель с индексом "+IntToStr(i));
Exit;
End;
End;
ShowMessage("панели где то рядом, целься лучше");
end;
← →
ПостОвый терминатор © (2008-01-16 16:07) [10]
> Palladin © (16.01.08 15:46) [7]
>
> > [5] ПостОвый терминатор © (16.01.08 15:37)
>
> казалось бы причем тут image1
Просто мне показалось, что это довольно простое решение отвечающее
> Хм, а как запуздырить иконку в StatusBar?
Ведь о функциональности этой иконки автор умалчивает.
А на TImage можно повесить практически любые события ...
← →
Palladin © (2008-01-16 16:09) [11]
> [10] ПостОвый терминатор © (16.01.08 16:07)
если внимательно приглядишься, афтар поступил несоизмеримо гораздо более разумно нежели плодить кучу TImage, а обвешивание иконок событиями - несколько строчек кода на соотвествующие события TStatusBar
← →
ПостОвый терминатор © (2008-01-16 16:11) [12]
> Palladin © (16.01.08 16:09) [11]
Возможно
← →
Kolan © (2008-01-16 16:26) [13]Благодарю, круто. :)
procedure TMainForm.StatusBarDblClick(Sender: TObject);
begin
if Sender is TStatusBar then
begin
if GetPanelIndexAtCursor(Sender as TStatusBar) = 1 then
ChooseCurrentPeriodAction.Execute;
end;
end;
function TMainForm.GetPanelIndexAtCursor(AStatusBar: TStatusBar): Integer;
var
I: Integer;
CursorPos: TPoint;
X: Integer;
begin
Result := —1;
if Assigned(AStatusBar) then
begin
CursorPos := AStatusBar.ScreenToClient(Mouse.CursorPos);
X := 0;
for I := 0 to AStatusBar.Panels.Count — 1 do
begin
X := X + AStatusBar.Panels[I].Width;
if X > CursorPos.X then
begin
Result := I;
Exit;
end;
end;
end;
end;
← →
Palladin © (2008-01-16 16:32) [14]if Sender is TStatusBar then
begin
if GetPanelIndexAtCursor(Sender as TStatusBar) = 1 then ChooseCurrentPeriodAction.Execute;
end;
as зря, приведением типов будет быстрее и абсолютно правомерно, бо ты уже проверил используя is
здесь это конечно не критично, но просто на будущее, если планируется частый частый вызов подобной конструкции
← →
Kolan © (2008-01-16 16:38) [15]>
> здесь это конечно не критично, но просто на будущее, если
> планируется частый частый вызов подобной конструкции
ок. Запомню, незнал что быстрее.
А где стандартная процедура подставляет смещение для текста, вот эти циферки:StatusBar.Canvas.TextOut(Rect.Left+5+MainMenuImageList.Width, Rect.Top+3, Panel.Text);
Я щас растянул бар, и моя надпись уже не на одном уровне со стандартно нарисованной. Видимо стандартная вычисляет как-то, но не найду как.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c