Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
StringGrid에서 행을 선택적으로 읽어오려면..
Grid의 Cell를 각 행단위로 선택적으로 원하는 행만 읽어오고 싶은데
어떻게 해야하는지 궁금하군요...
1
COMMENTS
구창민
•
1999.08.31 02:00
문해영 께서 말씀하시기를...
> Grid의 Cell를 각 행단위로 선택적으로 원하는 행만 읽어오고 싶은데
> 어떻게 해야하는지 궁금하군요...
>
>
문해영님 안녕하세요?
아래내용을 참조하시면 해결가능할거 같네요.
영대님 팁에서 펐답니다.
< StringGrid 의 선택영역만 클립보드로 복사하기 >
// <사용방법> 아래 코딩을 하신후에 StringGrid의 Options의 goRangeSelect 를 True로
// 설정하신 다음에 컴파일 하세요
// 실행후 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);
begin
// StringGrid의 선택된 영역을 클립보드로 북사
CopySelectedGridToClipboard(StringGrid1);
// 클립보드의 내용을 메모로 붙여넣기(테스트용)
Memo1.Clear;
Memo1.PasteFromClipboard;
end;
end.
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
델러비언
•
1999.08.31 02:03
1
COMMENTS
/
0
LIKES
윈도우에서 실행된 파일을 잡을 수 있을까요?? 도와주세요...
구창민
•
1999.08.31 02:12
델러비언 께서 말씀하시기를... > 윈도우에서 한번이라도 실행되었던 파일을 모두 잡고 싶은데 방법을 잘 ...
Lyle
•
1999.08.31 01:31
2
COMMENTS
/
0
LIKES
array 와 pointer
구창민
•
1999.08.31 02:10
안녕하세요? 파스칼 언어는 C못지 않은 문법체계를 구축하고 있습니다. C언어에 익숙해져 있다가 적응하...
Lyle
•
1999.08.31 03:31
구창민 께서 말씀하시기를... > 안녕하세요? > 파스칼 언어는 C못지 않은 문법체계를 구축하고 있습니다....
문해영
•
•
1999.08.30 23:57
1
COMMENTS
/
1
LIKES
StringGrid에서 행을 선택적으로 읽어오려면..
Grid의 Cell를 각 행단위로 선택적으로 원하는 행만 읽어오고 싶은데 어떻게 해야하는지 궁금하군요...
구창민
•
1999.08.31 02:00
문해영 께서 말씀하시기를... > Grid의 Cell를 각 행단위로 선택적으로 원하는 행만 읽어오고 싶은데 > ...
young
1999.08.30 23:41
0
COMMENTS
/
0
LIKES
넷스케이프 메신저에 email address 띄우기???
rivero
1999.08.30 23:37
0
COMMENTS
/
0
LIKES
TEXT FILE 출력시 글자사이간격 지정????
김명찬
•
1999.08.30 22:53
1
COMMENTS
/
0
LIKES
인스톨 쉴드를 이용할때..
한근수
•
1999.08.31 00:11
김명찬 께서 말씀하시기를... > 간단한 주소록 프로그램을 만들었습니다. > 디비는 파라독스를 이용했는...
정근수
•
1999.08.30 22:21
2
COMMENTS
/
0
LIKES
긴급 질문 TXT File을 오라클 로 Import......
김영대
•
1999.08.30 23:14
정근수 께서 말씀하시기를... > 급한 일 때문에 이렇게 질문을... > TXT 화일을 오라클 DB로 가장 빨리 I...
정근수
•
1999.08.31 01:01
김영대 께서 말씀하시기를... > 정근수 께서 말씀하시기를... > > 급한 일 때문에 이렇게 질문을... > >...
송기원
1999.08.30 21:26
0
COMMENTS
/
0
LIKES
자료 저장중 오류가 발생합니다.. 이유가..??
리디아
•
1999.08.30 21:26
1
COMMENTS
/
0
LIKES
아이콘을 넣는 방법을 알려주세요!
이정욱
•
1999.08.30 21:43
Resource에디터를 사용하세요. 그렇게 하면 가능합니다. 개인적으로 저는 볼랜드에서 나온 리소스워크샵...
정양재
1999.08.30 21:00
0
COMMENTS
/
0
LIKES
두개의 DB Grid 사이의 레코드 이동할때 이상
안명호
•
1999.08.30 20:44
1
COMMENTS
/
0
LIKES
웹페이지에서 cgi로 넘겨주는 파라미터...
홍순용
•
1999.09.13 22:01
안명호 wrote: > 웹페이지에서 cgi로 넘겨주는 파라미터를 쉽게 확인할 수 있는 > 방법이 있나요? tag...
김장현
•
1999.08.30 20:05
1
COMMENTS
/
0
LIKES
[문의]install shield에 대하여
유도삼
•
1999.08.30 21:12
김장현 께서 말씀하시기를... > 안녕하세요. 저는 programming 을 좋아하는 학생입니다. 델파이로 프로그...
유희정
1999.08.30 20:00
0
COMMENTS
/
0
LIKES
만든 컴포넌트에서 form이 크기조절이 된것을 알려면
파이공주
•
1999.08.30 18:13
1
COMMENTS
/
0
LIKES
돈에 대해 많이 다뤄보신분께 질문드립니다..
유도삼
•
1999.08.30 19:38
파이공주 께서 말씀하시기를... > 돈을 입력하는 컨트롤을 알고 싶습니다. > editbox는 오른쪽 정렬이 되...
장철진
•
1999.08.30 10:36
2
COMMENTS
/
0
LIKES
LAN간의 같은테이블의 같은 레코드에서 락....
김영대
•
1999.08.30 19:09
"Search the Borland Web Site" http://www.borland.com/searchsite/ 에서 "record lock" 으로 검색해...
장철진
•
1999.08.31 04:12
김영대 께서 말씀하시기를... > "Search the Borland Web Site" > http://www.borland.com/searchsite/...
강민주
•
1999.08.30 07:43
1
COMMENTS
/
0
LIKES
날짜 이동 어떻게?
김영대
•
1999.08.30 18:00
강민주 께서 말씀하시기를... > 안녕하세요. > 날짜를 하루 이전/이후는 FormatDateTime("yyyy-mm-dd", S...
초짜델퍼
•
1999.08.30 05:19
1
COMMENTS
/
0
LIKES
좀 가르쳐 주세요..... ^_^
김영대
•
1999.08.30 18:08
바탕화면의 아이콘을 불러오는 방법이 따로 있는지는 모르지만 Windows바탕화면 디렉토리에 보시면 *.lnk ...
jerry
1999.08.29 21:11
0
COMMENTS
/
0
LIKES
엑세스에서...
neperz
1999.08.29 20:17
0
COMMENTS
/
0
LIKES
wh_mouse에 관한...
황현동
•
1999.08.29 18:55
1
COMMENTS
/
0
LIKES
메뉴에 check 하고 끝네면..
구창민
•
1999.08.30 04:43
황현동 께서 말씀하시기를... > 제가 메뉴를 클릭하면 체크가 되게 해놨는데.. > > 끝내고 다시 실행 ...
문해영
1999/08/30 23:57
Views
1076
Likes
1
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
> Grid의 Cell를 각 행단위로 선택적으로 원하는 행만 읽어오고 싶은데
> 어떻게 해야하는지 궁금하군요...
>
>
문해영님 안녕하세요?
아래내용을 참조하시면 해결가능할거 같네요.
영대님 팁에서 펐답니다.
< StringGrid 의 선택영역만 클립보드로 복사하기 >
// <사용방법> 아래 코딩을 하신후에 StringGrid의 Options의 goRangeSelect 를 True로
// 설정하신 다음에 컴파일 하세요
// 실행후 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);
begin
// StringGrid의 선택된 영역을 클립보드로 북사
CopySelectedGridToClipboard(StringGrid1);
// 클립보드의 내용을 메모로 붙여넣기(테스트용)
Memo1.Clear;
Memo1.PasteFromClipboard;
end;
end.