Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
제발 답변좀 해주세요....
제발 답변좀 해주세요...
스트링그리드에서 지원하는건 연속적인 데이타에 대해서만 다중선택(Multi Selection)이 가능 하더군요...
불행이도 저는 불연속적인 데이타에 대해서 다중선택해야 됩니다... 흑흑흑..
도와주세요...
고수님들 방법좀 가르쳐주세요... 부탁합니다...
1
COMMENTS
구창민
•
1999.06.11 20:54
황익순 께서 말씀하시기를...
> 제발 답변좀 해주세요...
>
> 스트링그리드에서 지원하는건 연속적인 데이타에 대해서만 다중선택(Multi Selection)이 가능 하더군요...
>
> 불행이도 저는 불연속적인 데이타에 대해서 다중선택해야 됩니다... 흑흑흑..
>
> 도와주세요...
>
> 고수님들 방법좀 가르쳐주세요... 부탁합니다...
황익순님 안녕하세요?
아래 내용은 영대님의 스트링 그리드 멀티셀렉트 팁입니다.
응용하시면 충분히 해결하실수 있으실 겁니다.
즐거운 프로그래밍 되세요~ ^^
// <사용방법> 아래 코딩을 하신후에 StringGrid의 어떤 프로퍼티도 변경할 필요가 없습니다
// Button1 을 클릭하시면 StringGrid의 특정영역이 선택되고 그 내용을 클립보드로
// 복사한 다음 다시 Memo 에 붙여넣기가 됩니다
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, clipbrd;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Memo1: TMemo;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure CopyStreamToClipboard(S: TStream; fmt: Word);
var
hMem: THandle;
pMem: Pointer;
begin
{stream의 위치를 맨 앞으로 이동시킨다}
S.Position := 0;
{stream의 크기만큼 전역 힙(heap)에 메모리 블록을 할당한후 원도우 핸들을 얻는다}
hMem := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
if hMem <> 0 then
begin
{전역 힙의 할당된 메모리 블록을 고정(lock)시킨다}
pMem := GlobalLock(hMem);
if pMem <> nil then
begin
{할당받은 메모리 블럭에 stream의 내용을 복사한다}
S.Read(pMem^, S.Size);
{위의 S.Read()에 의해 증가된 포인터를 다시 맨 앞으로 이동시킨다}
S.Position := 0;
{전역 힙에서 메모리 블록의 잠금 해제}
GlobalUnlock(hMem);
{클립보드를 열러서 주어진 포맷(여기서는 CF_TEXT)과 원도우 핸들로 지정된
데이타를 클립보드에 준다}
Clipboard.Open;
try
Clipboard.SetAsHandle(fmt, hMem);
finally
Clipboard.Close;
end;
end
else
begin
{메모리 lock의 실패로 memory block 예외를 발생시킨다}
GlobalFree(hMem);
OutOfMemoryError;
end;
end
else
begin
{메모리 할당의 실패로 memory block 예외를 발생시킨다}
OutOfMemoryError;
end;
end;
procedure CopySelectedGridToClipboard(theGrid: TStringGrid);
var
m: TMemoryStream;
i, j: Integer;
S: String;
begin
m := TMemoryStream.Create;
try
with theGrid do
for i := theGrid.Selection.Top to theGrid.Selection.Bottom do
for j := theGrid.Selection.Left to theGrid.Selection.Right do
begin
S := Cells[j, i];
// 맨 마지막 선택된 Column이면 CR/LF 를 추가하여 행구분
if j = theGrid.Selection.Right then
AppendStr(S, #13#10)
else
AppendStr(S, #9); // 각 Column을 Tab 문자로 구분
m.WriteBuffer(S[1], Length(S));
end;
S[1] := #0; // 문자열 stream의 끝 표시
m.WriteBuffer(S[1], 1);
CopyStreamToClipboard(m, CF_TEXT); // stream의 내용을 클립보드로 복사
finally
m.Free;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
i, j: Integer;
begin
// Column의 title을 만든다
for i := 1 to StringGrid1.ColCount - 1 do
StringGrid1.Cells[i, 0] := Char(Ord('A')+i-1);
// Row의 title을 만든다
for i := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[0, i] := IntToStr(i);;
// 임의의 자료를 만들어서 각 cell에 입력합니다
for i := 1 to StringGrid1.ColCount - 1 do
for j := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[i, j] := Format('%.0n', [i * j * 10000.0]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
SelectedRectangle: TGridRect;
CoordTopLeft, CoordBottomRight: TGridCoord;
begin
// 선택하고자 하는 직사각형 영역을 설정한다
CoordTopLeft.X:= 2; // 두번째 컬럼부터 선택
CoordTopLeft.Y:= 1; // 첫번째 행부터 선택
CoordBottomRight.X:= StringGrid1.RowCount - 2; // 마지막 컬럼의 전컬럼
CoordBottomRight.Y:= StringGrid1.ColCount - 2; // 마지막 행의 전행
// 직사각형 영역을 TGridRect 에 할당한다
with StringGrid1 do
begin
SelectedRectangle.TopLeft := CoordTopLeft;
SelectedRectangle.BottomRight := CoordBottomRight;
end;
StringGrid1.Selection:= SelectedRectangle;
// StringGrid의 선택된 영역을 클립보드로 북사
CopySelectedGridToClipboard(StringGrid1);
// 클립보드의 내용을 메모로 붙여넣기(테스트용)
Memo1.Clear;
Memo1.PasteFromClipboard;
end;
end.
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
황익순
•
1999.06.11 02:28
1
COMMENTS
/
0
LIKES
제발 답변좀 해주세요....
제발 답변좀 해주세요... 스트링그리드에서 지원하는건 연속적인 데이타에 대해서만 다중선택(Multi Selection)이 가능 하더군요... 불행이도 저는 불연속적인 데이타에 대해서 다중선택해야 됩니다... 흑흑흑.. 도와주세요... 고수님들 ...
구창민
•
1999.06.11 20:54
황익순 께서 말씀하시기를... > 제발 답변좀 해주세요... > > 스트링그리드에서 지원하는건 연속적인 ...
이상석
•
1999.06.11 02:12
1
COMMENTS
/
0
LIKES
무슨 내용의 에라인지....
공대규
•
1999.06.11 02:50
델파이로 프로그래밍하다 보면 맨날 만나는 에러 메시지입니다. 한마디로 메모리 접근시 문제가 생기면 대...
박성훈
•
1999.06.11 02:00
1
COMMENTS
/
0
LIKES
dbgrid에서 필드에 따라 글자색을 변경...
백승환
•
1999.06.11 06:18
박성훈 께서 말씀하시기를... > 식당주문관련 프로그램을 만들고 있는데요. > > 판매테이블:판매코드, ...
박성훈
•
1999.06.11 01:45
2
COMMENTS
/
0
LIKES
dbgrid에서 한줄 선택...
백승환
•
1999.06.11 06:24
박성훈 께서 말씀하시기를... > 레이블을 클릭하면 dbgrid에 한줄만 선택되도록 하고 싶은데요. > rowsel...
[재질문]dbgrid에서
•
1999.06.13 21:32
백승환 께서 말씀하시기를... > 박성훈 께서 말씀하시기를... > > 레이블을 클릭하면 dbgrid에 한줄만 선...
장태남
1999.06.10 23:43
0
COMMENTS
/
0
LIKES
tclientdataset 에서 새로운 칼럼의 추가시
최선기
•
1999.06.10 23:03
2
COMMENTS
/
0
LIKES
[요청]Query컴포넌트의 params 속성의 의미 좀
백승환
•
1999.06.11 08:28
최선기 께서 말씀하시기를... > 안녕하세요.. 델파이를 배우고 있는 회사원입니다. > 제가 물어볼 것은 ...
박성훈
•
1999.06.11 01:36
최선기 께서 말씀하시기를... > 안녕하세요.. 델파이를 배우고 있는 회사원입니다. > 제가 물어볼 것은 ...
수빈
•
1999.06.10 22:58
1
COMMENTS
/
0
LIKES
ActiveForm 의 OCX Down에대해
공대규
•
1999.06.11 02:26
cayp.inf 파일의 내용을 한 번 올려 주실래요? 제가 한 번 볼께요... 수빈 께서 말씀하시기를... > Ac...
왕초
•
1999.06.10 22:30
1
COMMENTS
/
0
LIKES
DLL debugging.....
글쎄요
•
1999.06.10 23:34
왕초 께서 말씀하시기를... > DLL를 디버깅하려고 합니다.. > DLL 프로젝트를 어플리케이션에서 포함하여...
김동희
1999.06.10 21:56
0
COMMENTS
/
0
LIKES
2184번을 읽어 주세요.
chobo
1999.06.10 21:09
0
COMMENTS
/
0
LIKES
PopUpMenu의 왼쪽마우스 조작
franco97
•
1999.06.10 20:18
1
COMMENTS
/
0
LIKES
RichEdit에서 Ctrl+Enter를 Enter처리없이...
구창민
•
1999.06.10 20:45
franco97 께서 말씀하시기를... > RichEdit에서 입력을 하다가 Ctrl+Enter를 입력하면 아래칸으로 이동을 ...
powermac
1999.06.10 19:31
0
COMMENTS
/
0
LIKES
Delphi 실무지도 외부강사 초빙(3개월)
송기원
•
1999.06.10 19:25
1
COMMENTS
/
0
LIKES
Windows 95의 활성프로그램 목록얻는방법?
구창민
•
1999.06.10 20:22
송기원 께서 말씀하시기를... > windows 95에서 실행중인 모든 프로그램의 Handle을 참조할려고 합니다. ...
이승윤
•
1999.06.10 17:52
2
COMMENTS
/
0
LIKES
jpeg파일들을 dll로 작성해서 사용하는 방법
글쎄요
•
1999.06.11 00:02
이승윤 께서 말씀하시기를... > 여러개의 jpeg파일을 dll형태로 만들어서 사용하는 방법을 모르겠습니다. ...
구창민
•
1999.06.10 20:16
이승윤 께서 말씀하시기를... > 여러개의 jpeg파일을 dll형태로 만들어서 사용하는 방법을 모르겠습니다. ...
김동희
1999.06.10 09:56
0
COMMENTS
/
0
LIKES
서버와 MIDAS와의 관계
neperz
1999.06.10 09:01
0
COMMENTS
/
0
LIKES
126번과 비슷한 질문인데요....
정청환
•
1999.06.10 07:24
1
COMMENTS
/
0
LIKES
stringgrid에서 한 라인(Row)을 삭제
김성동
•
1999.06.11 00:10
StringGrid의 소스를 보면 protected 멤버로 DeleteRow란 프로시져가 있습니다. 그러니까 StringGrid에서 ...
정청환
•
1999.06.10 07:21
1
COMMENTS
/
0
LIKES
stringgrid에서 한 라인(Row)을 삭제
김태균
•
1999.06.10 18:23
정청환 께서 말씀하시기를... > stringgrid에서 한 라인(Row)을 삭제 > > stringgrid에서 한 라인(Row)...
chobo
•
1999.06.10 07:13
1
COMMENTS
/
0
LIKES
ShellExecute에 대해서
최석기
•
1999.06.10 09:22
chobo 께서 말씀하시기를... > 프로그램에서 특정프로그램을 동작시킬려고 합니다. > ShellExecute()함수...
만득이
1999.06.10 07:01
0
COMMENTS
/
0
LIKES
익스플로러의 페이지 내용을 가져오려면???
황익순
1999/06/11 02:28
Views
168
Likes
0
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
> 제발 답변좀 해주세요...
>
> 스트링그리드에서 지원하는건 연속적인 데이타에 대해서만 다중선택(Multi Selection)이 가능 하더군요...
>
> 불행이도 저는 불연속적인 데이타에 대해서 다중선택해야 됩니다... 흑흑흑..
>
> 도와주세요...
>
> 고수님들 방법좀 가르쳐주세요... 부탁합니다...
황익순님 안녕하세요?
아래 내용은 영대님의 스트링 그리드 멀티셀렉트 팁입니다.
응용하시면 충분히 해결하실수 있으실 겁니다.
즐거운 프로그래밍 되세요~ ^^
// <사용방법> 아래 코딩을 하신후에 StringGrid의 어떤 프로퍼티도 변경할 필요가 없습니다
// Button1 을 클릭하시면 StringGrid의 특정영역이 선택되고 그 내용을 클립보드로
// 복사한 다음 다시 Memo 에 붙여넣기가 됩니다
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, clipbrd;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Memo1: TMemo;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure CopyStreamToClipboard(S: TStream; fmt: Word);
var
hMem: THandle;
pMem: Pointer;
begin
{stream의 위치를 맨 앞으로 이동시킨다}
S.Position := 0;
{stream의 크기만큼 전역 힙(heap)에 메모리 블록을 할당한후 원도우 핸들을 얻는다}
hMem := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
if hMem <> 0 then
begin
{전역 힙의 할당된 메모리 블록을 고정(lock)시킨다}
pMem := GlobalLock(hMem);
if pMem <> nil then
begin
{할당받은 메모리 블럭에 stream의 내용을 복사한다}
S.Read(pMem^, S.Size);
{위의 S.Read()에 의해 증가된 포인터를 다시 맨 앞으로 이동시킨다}
S.Position := 0;
{전역 힙에서 메모리 블록의 잠금 해제}
GlobalUnlock(hMem);
{클립보드를 열러서 주어진 포맷(여기서는 CF_TEXT)과 원도우 핸들로 지정된
데이타를 클립보드에 준다}
Clipboard.Open;
try
Clipboard.SetAsHandle(fmt, hMem);
finally
Clipboard.Close;
end;
end
else
begin
{메모리 lock의 실패로 memory block 예외를 발생시킨다}
GlobalFree(hMem);
OutOfMemoryError;
end;
end
else
begin
{메모리 할당의 실패로 memory block 예외를 발생시킨다}
OutOfMemoryError;
end;
end;
procedure CopySelectedGridToClipboard(theGrid: TStringGrid);
var
m: TMemoryStream;
i, j: Integer;
S: String;
begin
m := TMemoryStream.Create;
try
with theGrid do
for i := theGrid.Selection.Top to theGrid.Selection.Bottom do
for j := theGrid.Selection.Left to theGrid.Selection.Right do
begin
S := Cells[j, i];
// 맨 마지막 선택된 Column이면 CR/LF 를 추가하여 행구분
if j = theGrid.Selection.Right then
AppendStr(S, #13#10)
else
AppendStr(S, #9); // 각 Column을 Tab 문자로 구분
m.WriteBuffer(S[1], Length(S));
end;
S[1] := #0; // 문자열 stream의 끝 표시
m.WriteBuffer(S[1], 1);
CopyStreamToClipboard(m, CF_TEXT); // stream의 내용을 클립보드로 복사
finally
m.Free;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
i, j: Integer;
begin
// Column의 title을 만든다
for i := 1 to StringGrid1.ColCount - 1 do
StringGrid1.Cells[i, 0] := Char(Ord('A')+i-1);
// Row의 title을 만든다
for i := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[0, i] := IntToStr(i);;
// 임의의 자료를 만들어서 각 cell에 입력합니다
for i := 1 to StringGrid1.ColCount - 1 do
for j := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[i, j] := Format('%.0n', [i * j * 10000.0]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
SelectedRectangle: TGridRect;
CoordTopLeft, CoordBottomRight: TGridCoord;
begin
// 선택하고자 하는 직사각형 영역을 설정한다
CoordTopLeft.X:= 2; // 두번째 컬럼부터 선택
CoordTopLeft.Y:= 1; // 첫번째 행부터 선택
CoordBottomRight.X:= StringGrid1.RowCount - 2; // 마지막 컬럼의 전컬럼
CoordBottomRight.Y:= StringGrid1.ColCount - 2; // 마지막 행의 전행
// 직사각형 영역을 TGridRect 에 할당한다
with StringGrid1 do
begin
SelectedRectangle.TopLeft := CoordTopLeft;
SelectedRectangle.BottomRight := CoordBottomRight;
end;
StringGrid1.Selection:= SelectedRectangle;
// StringGrid의 선택된 영역을 클립보드로 북사
CopySelectedGridToClipboard(StringGrid1);
// 클립보드의 내용을 메모로 붙여넣기(테스트용)
Memo1.Clear;
Memo1.PasteFromClipboard;
end;
end.