Q&A

  • TImage
보여지는 틀보다 큰 사이즈의 이미지를 불러오려고 합니다...
물론 불어와는 지는데 제가 원하는 대로는 되지 않는군요...

예를 들면 틀보다 그림의 사이즈가 크기때문에 stretch를 쓰면 틀에 맞게 보여지기는 합니다. 또, 중앙에 정렬시킬 수도 있구요... 그런데, 제가 원하는 것은 틀에는 보여줄 수 있는 크기만 보여지구 마우스로 그림을 잡아서 옮긴다던지 하면서 전체를 훑어 볼 수 있는 것을 원하거든요...
혹시 제가 property, event를 잘 몰라서 그런 것일 수도 있습니다...
아시는 분 좀 알려주세요...
3  COMMENTS
  • Profile
    홍성락 2002.08.01 20:23
    hsr//////////////////////////////////////////////////////////
    아래것은 컴포넌트이동이구요.
    지금은 캠퍼스를 써서 이미지 확대,축소,이동,회전 예제입니다.
    늦게 또 보내는것은 필요로 예제 만들다 여기저기 종합하다가
    참고하시면 좋을것 같아서요...
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, jpeg, ExtDlgs;
    CONST
        MaxPixelCount   =  32768;
        
    TYPE
        pRGBArray  =  ^TRGBArray;    // Use SysUtils.pByteArray for 8-bit color
        TRGBArray  =  ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
        
    type
      TForm1 = class(TForm)
        ScrollBar2: TScrollBar;
        Panel3: TPanel;
        Label19: TLabel;
        ScrollBar1: TScrollBar;
        ScrollBar3: TScrollBar;
        Image1: TImage;
        Image2: TImage;
        Button1: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        ScrollBar4: TScrollBar;
        LabelRotateTime: TLabel;
        Label1: TLabel;
        Button2: TButton;
        SavePictureDialog1: TSavePictureDialog;
        procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
          var ScrollPos: Integer);
        procedure FormShow(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        BitmapOriginal:  TBitmap;
        BitmapRotated :  TBitmap;
        iRotationAxis  :  INTEGER;
        jRotationAxis  :  INTEGER;
        procedure WMEraseBkgnd(var M: TWMEraseBkGnd); message WM_ERASEBKGND;
        procedure Redraw;
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}
    ////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      iRotationAxis  := 0;
      jRotationAxis  := 0;
      BitmapOriginal := TBitmap.Create;
      BitmapRotated  := TBitmap.Create;
    end;

    procedure TForm1.FormShow(Sender: TObject);
    begin
    //
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       BitmapOriginal.Free;
       BitmapRotated.Free;
    end;

    procedure TForm1.FormResize(Sender: TObject);
    begin
      Redraw;
    end;
    ////////////////////////////////////////////////////////////////////////////////
    //이미지그릴때 깜박거림 없애기
    procedure TForm1.WMEraseBkgnd(var M: TWMEraseBkGnd);
    begin
        M.Result := 1;
    end;
    ////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.Redraw;
    VAR
        cosTheta       :  DOUBLE;
        Delta          :  DWORD;     // D3/D4 compatibility
        i              :  INTEGER;
        iOriginal      :  INTEGER;
        iPrime         :  INTEGER;
        iPrimeRotated  :  INTEGER;
        j              :  INTEGER;
        jOriginal      :  INTEGER;
        jPrime         :  INTEGER;
        jPrimeRotated  :  INTEGER;
        RowOriginal    :  pRGBArray;
        RowRotated     :  pRGBArray;
        sinTheta       :  DOUBLE;
        StartTime      :  DWORD;
        Theta          :  DOUBLE;

        TransX, TransY, diffX, diffY  : Integer;
    begin
      //회전
      BitmapRotated.Width  := BitmapOriginal.Width;
      BitmapRotated.Height := BitmapOriginal.Height;
      BitmapRotated.PixelFormat := pf24bit;
      StartTime := GetTickCount;

      Theta := -(ScrollBar4.Position) * PI / 180;
      sinTheta := SIN(Theta);
      cosTheta := COS(Theta);

      FOR j := BitmapRotated.Height-1 DOWNTO 0 DO
      BEGIN
        RowRotated  := BitmapRotated.Scanline[j];

        jPrime := 2*(j - jRotationAxis) + 1;

        FOR i := BitmapRotated.Width-1 DOWNTO 0 DO
        BEGIN

          iPrime := 2*(i - iRotationAxis) + 1;
          iPrimeRotated := ROUND(iPrime * CosTheta - jPrime * sinTheta);
          jPrimeRotated := ROUND(iPrime * sinTheta + jPrime * cosTheta);
          iOriginal := (iPrimeRotated - 1) DIV 2 + iRotationAxis;
          jOriginal := (jPrimeRotated - 1) DIV 2 + jRotationAxis;

          IF   (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND
               (jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1)
          THEN BEGIN
            RowOriginal := BitmapOriginal.Scanline[jOriginal];
            RowRotated[i]  := RowOriginal[iOriginal]
          END
          ELSE BEGIN
            RowRotated[i].rgbtBlue  := 255;  // assign "corner" color
            RowRotated[i].rgbtGreen := 0;
            RowRotated[i].rgbtRed   := 0
          END

        END
      END;
      Delta := GetTickCount - StartTime;    // "stop" the clock
      LabelRotateTime.Caption := 'Rotation Time = ' + IntToStr(Delta) + ' ms';

        //--------------------------------------------------------------------------
        //위치이동 //확대/축소
        TransX :=  (ScrollBar1.Position);
        TransY :=  (ScrollBar2.Position);
        Image1.Picture := nil;  //image1.Canvas.Brush.Color := clWhite;
        diffX := Round((BitmapRotated.Width*ScrollBar3.Position)/100);
        diffY := Round((BitmapRotated.Height*ScrollBar3.Position)/100);
        StretchBlt(Image1.Canvas.Handle, TransX, TransY, BitmapRotated.Width + diffX, BitmapRotated.Height + diffY,
                   BitmapRotated.Canvas.Handle, 0, 0, BitmapRotated.Width, BitmapRotated.Height, SRCCOPY);
    end;
    ////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    begin
      Redraw;
    end;

    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION LoadGraphicsFile(CONST Filename:  STRING):  TBitmap;
    VAR
      Extension:  STRING;
      {$IFDEF GIF}
      GIFImage :  TGIFImage;
      {$ENDIF}
      Icon     :  TIcon;
      JPEGImage:  TJPEGImage;
      Metafile :  TMetafile;
    BEGIN
        RESULT := NIL;  // In case anything goes wrong

        IF   FileExists(Filename)
        THEN BEGIN
          Extension := UpperCase( COPY(Filename, LENGTH(Filename)-2, 3) );

          // Quick and dirty check that file type is OK
          ASSERT( (Extension = 'BMP')  OR
                  (Extension = 'EMF')  OR
          {$IFDEF GIF}
                  (Extension = 'GIF')  OR
          {$ENDIF}
                  (Extension = 'ICO')  OR
                  (Extension = 'JPG')  OR
                  (Extension = 'WMF') );

          RESULT := TBitmap.Create;

          // BMP File -- no additional work to get TBitmap
          IF   Extension = 'BMP'
          THEN RESULT.LoadFromFile(Filename);

          {$IFDEF GIF}
          // GIF File
          IF   Extension = 'GIF'
          THEN BEGIN
            GIFImage := TGIFImage.Create;
            TRY
              GIFImage.LoadFromFile(Filename);
              RESULT.Height      := GIFImage.Height;
              RESULT.Width       := GIFImage.Width;
              RESULT.PixelFormat := pf24bit;
              RESULT.Canvas.Draw(0,0, GIFImage)
            FINALLY
              GIFImage.Free
            END
          END;
         {$ENDIF}

          // ICO File
          IF   Extension = 'ICO'
          THEN BEGIN
            Icon := TIcon.Create;
            TRY
              TRY
                Icon.LoadFromFile(Filename);
                RESULT.Height      := Icon.Height;
                RESULT.Width       := Icon.Width;
                RESULT.PixelFormat := pf24bit;    // avoid palette problems
                RESULT.Canvas.Draw(0,0, Icon)
                EXCEPT
                // Ignore problem icons, e.g., Stream read errors
              END;

            FINALLY
              Icon.Free
            END
          END;

          // JPG File
          IF   Extension = 'JPG'
          THEN BEGIN
            JPEGImage := TJPEGImage.Create;
            TRY
              JPEGImage.LoadFromFile(Filename);
              RESULT.Height      := JPEGImage.Height;
              RESULT.Width       := JPEGImage.Width;
              RESULT.PixelFormat := pf24bit;
              RESULT.Canvas.Draw(0,0, JPEGImage)
            FINALLY
              JPEGImage.Free
            END
          END;

          // Windows Metafiles, WMF or EMF
          IF   (Extension = 'WMF') OR
               (Extension = 'EMF')
          THEN BEGIN
            Metafile := TMetafile.Create;
            TRY
              Metafile.LoadFromFile(Filename);
              RESULT.Height      := Metafile.Height;
              RESULT.Width       := Metafile.Width;
              RESULT.PixelFormat := pf24bit;    // avoid palette problems
              RESULT.Canvas.Draw(0,0, Metafile)
            FINALLY
              Metafile.Free
            END
          END;

        END;

        // If Graphic is missing or invalid, create the "Red X"
        IF   RESULT = NIL
        THEN BEGIN
          RESULT.Height      := 32;
          RESULT.Width       := 32;
          RESULT.PixelFormat := pf24bit;
          WITH RESULT.Canvas DO BEGIN
            Pen.Color := clRed;
            Pen.Width := 3;
            MoveTo( 2, 2);
            LineTo(29,29);

            MoveTo( 2,29);
            LineTo(29, 2);
          END
        END
    END {LoadGraphicFile};

    ///////////////////////////////////////////////////////////////////
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        if OpenPictureDialog1.Execute then begin
           Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName);
           BitmapOriginal := LoadGraphicsFile(OpenPictureDialog1.FileName);
           //BitmapRotated := LoadGraphicsFile(OpenPictureDialog1.FileName);


           ScrollBar1.Max := BitmapOriginal.Width;
           ScrollBar1.Min := -BitmapOriginal.Width;
           ScrollBar2.Max := BitmapOriginal.Height;
           ScrollBar2.Min := -BitmapOriginal.Height;
           iRotationAxis  := BitmapOriginal.Width  DIV 2;
           jRotationAxis  := BitmapOriginal.Height DIV 2;

           Redraw;
        end;
    end;
    //////////////////////////////////////////////////////////////////////
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if SavePictureDialog1.Execute then
         BitmapRotated.SaveToFile(SavePictureDialog1.Filename)
    end;

    end.
  • Profile
    홍성락 2002.07.06 08:49
    hsr//////////////////////////////////////////////////////
    예제는 자료실에 올려 놓았으나
    다른 좋은방법도 있을겁니다

    일단, 컴포넌트 이동방법을 사용해보았습니다
    컴포이동 루틴은 어떤 뛰어나신분이 올려 놓았는데 성함을 모르겠네요.

    일단 매아래 루틴으로 CtrlSize.pas을 만든후

    사용할 폼의 유닛에 CtrlSize을선언한후
    전역변수 CurControl: TControlSizer;를 선언하신후

    패널안에 이미지를 넣구요, autosize을 True하시후
    마우스다운 이벤트에
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        CurControl := TControlSizer.Create(Self, Sender as TControl);
    end;

    CtrlSize.pas 파일만드세요////////////////////////////////////////////
    unit CtrlSize;

    interface

    uses
    Classes, Windows, Messages, Controls, StdCtrls;

    const
    sc_DragMove: Longint = $F012;

    type
    TControlSizer = class(TCustomControl)
    private
      FControl: TControl;
      FRectList: array [1..8] of TRect;
      FPosList: array [1..8] of Integer;

    public
      constructor Create(AOwner: TComponent; AControl: TControl);
      procedure CreateParams(var Params: TCreateParams); override;
      procedure CreateHandle; override;
      procedure WmNcHitTest(var Msg: TWmNcHitTest); message WM_NCHITTEST;
      procedure WmSize(var Msg: TWmSize); message WM_SIZE;
      procedure WmLButtonDown(var Msg: TWmLButtonDown); message WM_LBUTTONDOWN;
      procedure WmButtonMOVE(var Msg: TWmMOUSEMOVE); message WM_MOUSEMOVE;
      procedure WmMove(var Msg: TWmMove); message WM_MOVE;
      procedure Paint; override;
      procedure ControlSizerExit(Sender: TObject);
    end;

    implementation

    uses Graphics;

    constructor TControlSizer.Create(AOwner: TComponent; AControl: TControl);
    var
    R: TRect;
    begin
    inherited Create(AOwner);
    FControl := AControl;

    OnExit := ControlSizerExit;

    R := FControl.BoundsRect;
    InflateRect(R, 2, 2);
    BoundsRect := R;

    Parent := FControl.Parent;

    FPosList [1] := htTopLeft;
    FPosList [2] := htTop;
    FPosList [3] := htTopRight;
    FPosList [4] := htRight;
    FPosList [5] := htBottomRight;
    FPosList [6] := htBottom;
    FPosList [7] := htBottomLeft;
    FPosList [8] := htLeft;
    end;

    procedure TControlSizer.CreateHandle;
    begin
    inherited CreateHandle;
    SetFocus;
    end;

    procedure TControlSizer.CreateParams(var Params: TCreateParams);
    begin
    inherited CreateParams(Params);
    Params.ExStyle := Params.ExStyle + ws_ex_Transparent;
    end;

    procedure TControlSizer.Paint;
    var
    I: Integer;
    begin
       Canvas.Brush.Color := clBlack;
       for I := 1 to  8 do
         Canvas.Rectangle(FRectList [I].Left, FRectList [I].Top,
           FRectList [I].Right, FRectList [I].Bottom);
    end;

    procedure TControlSizer.WmNcHitTest(var Msg: TWmNcHitTest);
    var
    Pt: TPoint;
    I: Integer;
    begin
    Pt := Point(Msg.XPos, Msg.YPos);
    Pt := ScreenToClient(Pt);
    Msg.Result := 0;
    for I := 1 to  8 do
      if PtInRect(FRectList [I], Pt) then
        Msg.Result := FPosList [I];

    if Msg.Result = 0 then
      inherited;
    end;

    procedure TControlSizer.WmSize(var Msg: TWmSize);
    var
    R: TRect;
    begin
    R := BoundsRect;
    InflateRect(R, -2, -2);
    FControl.BoundsRect := R;

    FRectList [1] := Rect(0, 0, 5, 5);
    FRectList [2] := Rect(Width div 2 - 3, 0,
      Width div 2 + 2, 5);
    FRectList [3] := Rect(Width - 5, 0, Width, 5);
    FRectList [4] := Rect(Width - 5, Height div 2 - 3,
    Width, Height div 2 + 2);
    FRectList [5] := Rect(Width - 5, Height - 5,
    Width, Height);
    FRectList [6] := Rect(Width div 2 - 3, Height - 5,
      Width div 2 + 2, Height);
    FRectList [7] := Rect(0, Height - 5, 5, Height);
    FRectList [8] := Rect(0, Height div 2 - 3,
    5, Height div 2 + 2);
    end;

    procedure TControlSizer.ControlSizerExit(Sender: TObject);
    begin
    Free;
    end;

    procedure TControlSizer.WmLButtonDown(var Msg: TWmLButtonDown);
    begin
    Perform(wm_SysCommand, sc_DragMove, 0);
    end;
    procedure TControlSizer.WmButtonMOVE(var Msg: TWmMOUSEMOVE);
    begin
    Paint;
    end;
    procedure TControlSizer.WmMove(var Msg: TWmMove);
    var
    R: TRect;
    begin
    R := BoundsRect;
    InflateRect(R, -2, -2);
    FControl.Invalidate;
    FControl.BoundsRect := R;

    end;

    end.
  • Profile
    김기성 2002.07.06 01:22

    그냥 Image 콤포넌트 프로퍼티중에서요
    Stretch 속성은 False로 주시고요
    Autosize속성을 True루 주시고 하시면 원하시는걸 하실 수 있을꺼 같습니다.
    • 윤가영
    • 2002.07.06 00:47
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2002.07.06 19:12
      개인적으로 오픈소스 버전 인터베이스를 추천합니다 지금은 없어졌습니다만..^^ 대신 FireBird로 바껴서 ...
    • 박창범
      2002.07.06 01:30
      전에 PostgreSQL 에 Linux 에서 프로젝트를 한적이 있었는데 그때까지도 무료였고 라이센스가 없는걸로 알...
    • 오소영
    • 2002.07.06 00:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정우영
      2002.07.06 02:11
      다음 함수를 이용해 보세요. Example입니다. 즐거운 하루되세요. The following example creates a dir...
    • 이현주
    • 2002.07.06 00:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 노익현
    • 2002.07.05 23:30
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최우영
    • 2002.07.05 23:01
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 장명선
      2002.07.06 00:25
      제가 사용하는 방법은 date형으로 만들지 않고 문자형으로 만들어서 사용합니다. 별 차이를 느끼지 못하거...
    • 최우영
      2002.07.06 00:33
      Query1.ParamByName('movedept').AsString :='' 이런식으로 넣으니까.. 1900-01-01이 나오네요.. NULL값으...
    • 장명선
      2002.07.06 00:38
      아~~~ 제가 말한것은.... 데이타베이스쪽 즉 테이블 생성시 날짜형으로 만들지 않고...문자형으로 만들어...
    • 이호성
    • 2002.07.05 22:38
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이병협
      2002.07.19 03:33
      일단 브라우져의 IHtmlDocument2을 얻어서 확인 버튼에 Click 이벤트를 날리면 됩니다. var  &nb...
    • 한대필
      2002.07.06 00:14
      다른 페이지를 만드시는 것이 좋을듯 싶습니다. 기존의 로그인 페이지에 버튼을 누르는 작동 보다는 ...
    • 박희경
      2002.07.06 02:04
      답변 감사드립니다. 아이디와 비번이 보여도 상관은 없거든요. 새로운 왭페이지를 만들어서 하지...
    • 김상수
    • 2002.07.05 21:52
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2002.08.01 20:23
      hsr////////////////////////////////////////////////////////// 아래것은 컴포넌트이동이구요. 지금은 ...
    • 홍성락
      2002.07.06 08:49
      hsr////////////////////////////////////////////////////// 예제는 자료실에 올려 놓았으나 다른 좋은...
    • 김기성
      2002.07.06 01:22
      그냥 Image 콤포넌트 프로퍼티중에서요 Stretch 속성은 False로 주시고요 Autosize속성을 True루 주시...
    • ooxx
    • 2002.07.05 21:27
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하기
      2002.07.05 23:18
        if (Key = #13) and (ActiveControl <> memo) then   begin   &...
    • 미소나눔
      2002.07.05 23:18
      Sender 로 비교해서 처리하면 될듯한데용.. 즐푸..
    • 박지원
    • 2002.07.05 20:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.05 21:15
      안녕하세요. 최용일입니다. 모두 가능합니다. 다른쪽에서 DLL을 지원한다면... 호출할때 Calling con...
    • 하종옥
    • 2002.07.05 20:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.05 21:13
      안녕하세요. 최용일입니다. TStringList.Text를 이용해보세요... ShowMessage(StringList1.Text); ...
    • 유충열
    • 2002.07.05 20:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.05 20:55
      안녕하세요. 최용일입니다. 질문의 요지를 명확히 모르겠네요... 메모리맵파일을 만들어서 제대로 만...
    • 장명선
      2002.07.06 00:29
      미리보기 하시면 프린트설정하는 부분에 부분출력이 있는데요 그걸 이용하면 되지 않나여 ? 잘 되던...
    • blackjewel
      2002.07.06 03:21
      답변 감사합니다. 하지만 제가 궁금한 것은 부분출력이 아닙니다. 윈도우에 프린트를 날렸을때 너무 ...
    • 장명선
      2002.07.06 00:30
      SQL문장을 봐야 정확한 답이 나올듯 하네요 select max(필드) from 테이블명 제일 큰값이 나오겠져 ?...
    • 김석
    • 2002.07.05 19:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2002.07.05 20:00
      procedure Form1.AppOnException(Sender: TObject; E: Exception); begin   If (Sender is TMa...
    • 최용일
      2002.07.05 21:07
    • 세미콜론
      2002.07.05 21:19
    • 최용일
      2002.07.06 00:57
    • 세미콜론
      2002.07.06 03:42
    • 최용일
      2002.07.06 04:09
    • 최용일
      2002.07.05 21:11
      안녕하세요. 최용일입니다. dpk(컴포넌트패키지)파일 델파이에서 열어보시면 Compile, Install버튼 있거...
    • 이정기
      2002.07.05 21:21
      dpk열어서 컴파일을 했더니 [Error] DirectX.pas(15992): $WEAKPACKAGEUNIT 'DirectX' cannot have initi...
    • 최용일
      2002.07.06 01:01
      델파이 6은 써본적이 없어서 잘 모르겠네요... 패키지프로젝트파일에서 WEAKPACKAGEUNIT 옵션 off로 해...