ScrollBar reagujący na lewy przycisk myszy poruszenie nią

0

Witam
Mam formę na której jest ramka. W ramce jest Image. Kiedy zostanie wczytany
obraz do Image który się nie mieści w ramce chcę przesuwać ScrollBary w taki
sposób:

procedure TForm1.Frame21Image1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in SHift then
  begin
    if MYSZKĘ_PRZESUWAM_W_LEWO then
      Frame21.HorzScrollBar.Position:=Frame21.HorzScrollBar.Position+1

    if MYSZKĘ_PRZESUWAM_W_PRAWO then
      Frame21.HorzScrollBar.Position:=Frame21.HorzScrollBar.Position-1

    if MYSZKĘ_PRZESUWAM_W_DÓŁ then
      Frame21.VertScrollBar.Position:=Frame21.HorzScrollBar.Position+1

    if MYSZKĘ_PRZESUWAM_W_GÓRĘ then
      Frame21.VertScrollBar.Position:=Frame21.HorzScrollBar.Position-1
  end;
end;

Jak rozwiązać taki problem?

0

użyj komponentu zoomler

PS masz 2x MYSZKĘ_PRZESÓWAM_W_DÓŁ :P

0

Za pomocą Zoomler'a można jedynie powiększać obraz. Przesuwać można za pomocą ZImage - bardzo pokrewne, ten sam autor.
Jednak do ZImage nie można wczytać nic innego niż BMP - to mnie trochę rozczarowało, bo mam do wczytania JPG i GIF
:(
Da się coś na to poradzić?

0

Skoro masz Delphi 7 to przekonwertuj tego BMP-ga. Do listy uses dodaj "jpeg". Oto kod konwersji:

var
  JPG : TJPEGImage;
  BMP : TImage;

begin
  JPG := TJPEGImage.Create;
  JPG.LoadFromFile('C:\\obrazek.JPG');
  BMP.Bitmap.Draw(0, 0, JPG);
  JPG.Free;
end;
0

Czy to ma wyglądać tak?

procedure TForm1.ListBox1Click(Sender: TObject);
var
 JPG : TJPEGImage;
 BMP : TImage;
begin
   Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'audio.ini');
  foto :=ExtractFilePath(Application.ExeName)+Ini.ReadString(ListBox1.Items[ListBox1.ItemIndex], 'foto','def');
 JPG := TJPEGImage.Create;
 JPG.LoadFromFile(foto);
 BMP.Bitmap.Draw(0, 0, JPG); // TU JEST BŁĄD
 ZImage1.Bitmap.LoadFromFile(foto);
 JPG.Free;

Bo kompilator mi odpowiada:
[Error] Unit1.pas(168): Undeclared identifier: 'Bitmap'

0

a zerknąłbyś do helpa... BMP.Canvas.Draw(0, 0, JPG);

0

a zerknąłbyś do helpa... BMP.Canvas.Draw(0, 0, JPG);

A nie:

BMP.Picture.Bitmap.Canvas.Draw(0, 0, JPG);

? :)

0

Sam TBitmap nie ma "Picture", TImage ma.

//teraz zauważyłem że wasze "BMP" to TImage.. co za..

0
BMP.Picture.Bitmap.Canvas.Draw(0, 0, JPG);

Teraz się kompiluje, ale przy próbie wczytania obrazu dostaję w tym miejscu błąd:

Access violation at adress 0047F843 in module 'Project1.exe'. Read of adress 00000168

0

Teraz się kompiluje, ale przy próbie wczytania obrazu dostaję w tym miejscu błąd:

A masz w uses 'jpeg'? Poza tym, tak wczytasz tylko jotpegi.

0

Oczywiście mam w uses JPEG i wczytuję jpegi

0

Szukając rozwiązania dałem sobie spokój z komponentem ZImage.
Zrobiłem coś takiego:

var
  Form1: TForm1;
  p1,p2: TPoint;

implementation

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if ssleft in shift then
   begin
       ReleaseCapture;
       getcursorpos(p2);
       scrollbox1.HorzScrollBar.Position:=p2.x-p1.x;
       scrollbox1.VertScrollBar.Position:=p2.y-p1.y;
   end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
getcursorpos(p1);
end;

Ale jeśli przesunę myszką zdjęcie do połowy a następnie chcę przesunąć
maksymalnie na koniec to zamiast przesuwać od miejsca w którym się znajduje
scrollbar, przesuwa od początku.
Jak to naprawić?

0

W Twojej implementacji brakuje odniesienia do aktualnej pozycji scrollbox1.HorzScrollBar.Position i [...]. Na początku wynoszą one [0,0] więc nie robią różnicy. Natomiast po przesunięciu nie są już [0,0]. Zwróć na to uwagę.

0

Zrobiłem to tak:

scrollbox1.HorzScrollBar.Position:=(scrollbox1.HorzScrollBar.Position + p1.x-p2.x);
scrollbox1.VertScrollBar.Position:=(scrollbox1.VertScrollBar.Position + p1.y-p2.y);

lub

scrollbox1.HorzScrollBar.Position:=(scrollbox1.HorzScrollBar.Position - p1.x+p2.x);
scrollbox1.VertScrollBar.Position:=(scrollbox1.VertScrollBar.Position - p1.y+p2.y);

Wszystko jest OK, ale teraz za szybko przewija. Jak to zwolnić?

0

scrollbox1.HorzScrollBar.Position i [...] zapamiętuj przy onMouseDown, i uaktualniaj przy onMouseUp (w osobnych zmiennych).

0

Udało się :)

var
  Form1: TForm1;
  p1,p2: TPoint;
  a,b : integer;

implementation

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if ssleft in shift then
  begin
    ReleaseCapture;
    getcursorpos(p2);
    scrollbox1.HorzScrollBar.Position:=(a + p1.x-p2.x);
    scrollbox1.VertScrollBar.Position:=(b + p1.y-p2.y);
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
getcursorpos(p1);
a:=scrollbox1.HorzScrollBar.Position;
b:=scrollbox1.VertScrollBar.Position;
end;

Wielkie dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1