Q&A

  • DBGrid에 메모필드 보이기 질문...
델가족 여러분 안녕 하십니까?

도움을 청할까 하고 문의 드립니다.

음... 메모필드를 입력하고 DBGrid로 보면 그냥 'Memo' 라고만 보이잖아요..

메모를 보이게 할려고 하는데 Q/A에서 조회해서 보니 한건이 있는데...

그 질문을 한 님도 에러라고... 저역시 에러..

아래는 소스인데요...



Type

MainMenu1: TMainMenu;



const

Max_Charsize = 50;



procedure TFm106.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

Field: TField; State: TGridDrawState);

var P : array [0..Max_charsize] of char;

BS : TBlobStream;

S : string;

begin

if field is TMemoField then begin

with (sender as TDBgrid).canvas do begin

Bs:= TBlobStream.create(SQL106Notes, bmReab);

Fillchar(P,Sizeof(P),#0);

Bs.read(P,MAX_CHARSIZE);

BS.Free;

s := strpas(P);

while Pos(#13,s)> 0 do

s[Pos(#13,s)] := ' ';

while Pos(#10, S) > 0 do

s[Pos(#10,s)] := ' ';

Fillrect(Rect);

end;

end;

end;



소스는 이런데요 이것이 DBGrid에 메모를 어떻게 나타내나요?

메모가 한줄 일 경우, 2줄 이상일 경우 어떻게 나타내죠?



음 저는 그리드에 데이타가 많을 경우 한줄, 또는 한줄이 길 경우 어느정도

잘라서 나타내고 싶거든요.



여러 고수님들의 아낌없는 성원 바랍니다.





4  COMMENTS
  • Profile
    김광섭 2001.02.01 00:59
    왕초보 wrote:

    > 델가족 여러분 안녕 하십니까?

    > 도움을 청할까 하고 문의 드립니다.

    > 음... 메모필드를 입력하고 DBGrid로 보면 그냥 'Memo' 라고만 보이잖아요..

    > 메모를 보이게 할려고 하는데 Q/A에서 조회해서 보니 한건이 있는데...

    > 그 질문을 한 님도 에러라고... 저역시 에러..

    > 아래는 소스인데요...

    >

    > Type

    > MainMenu1: TMainMenu;

    >

    > const

    > Max_Charsize = 50;

    >

    > procedure TFm106.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

    > Field: TField; State: TGridDrawState);

    > var P : array [0..Max_charsize] of char;

    > BS : TBlobStream;

    > S : string;

    > begin

    > if field is TMemoField then begin

    > with (sender as TDBgrid).canvas do begin

    > Bs:= TBlobStream.create(SQL106Notes, bmReab);

    > Fillchar(P,Sizeof(P),#0);

    > Bs.read(P,MAX_CHARSIZE);

    > BS.Free;

    > s := strpas(P);

    > while Pos(#13,s)> 0 do

    > s[Pos(#13,s)] := ' ';

    > while Pos(#10, S) > 0 do

    > s[Pos(#10,s)] := ' ';

    > Fillrect(Rect);

    > end;

    > end;

    > end;

    >

    > 소스는 이런데요 이것이 DBGrid에 메모를 어떻게 나타내나요?

    > 메모가 한줄 일 경우, 2줄 이상일 경우 어떻게 나타내죠?

    >

    > 음 저는 그리드에 데이타가 많을 경우 한줄, 또는 한줄이 길 경우 어느정도

    > 잘라서 나타내고 싶거든요.

    >

    > 여러 고수님들의 아낌없는 성원 바랍니다.

    >



    실제 그리드의 한 셀이 메모필드이거나 비트맵필드 라면 이를 보여주기 위해 구현할려면 나름대로 해결가능한 님들이야 문제가 없겠지만 대부분 골머리 아프죠 --;;

    기본적으로 델파이에서 제공하는 그리드는 하얀도화지라서 직접 구현해야 하는데 저두 실력이 변변치 않아서... --;;



    간단한 해결방법은 RealDBGrid 를 구입하세요 ^^;

    메모필드랑 비트맵필드를 제공하기때문에 아무런 코딩없이 프라퍼티 하나로 해결!!!

    많은 노력을 하시는 뭇 수행자분들에게는 지송함다.

  • Profile
    왕초보 2001.01.31 19:37
    답변이 없서서 생각을 했어요

    onCalcFields 이벤트를 활용 하자고...

    그래서 Calc 이벤트에서 변수 Memo를 String으로 주고

    그 변수에 메모필드를 대입했죠

    memo := copy(SQL106.fieldbyname('memo').asstring, 1, 100);

    그리고 Query 에 임시필드를 한개 만들어 주었어요 ma_memo 라고.

    이제 대입,

    Query.fieldbyname('ma_memo').asstring := memo;

    그리고 쿼리의 메모필드는 Visible을 False로 임시필드는 True로...



    정리하면



    procedure TFm106.Query1CalcFields(DataSet: TDataSet);

    var memo : string;

    begin

    memo := copy(Query1.fieldbyname('memo').asstring, 1, 100);

    Query1.fieldbyname('ma_memo').asstring := memo;

    end;



    end.



    근데 또다른 문제가 저를 반깁니다.

    그리드로 오픈해서 보면 그리드 한 셀에 Text가 보이는데(원래 메모에 5줄의 데이타가 있음)

    djatjdfjj

    좋은날 입니다

    맞습니다다.

    참 좋은 날 이버ㅣㄴ4ㅏ



    위처럼요...

    메모의 라인이 바뀌는 부분에 이상한 문자이기도 한 것이, 그림같기도 한 것이 보이

    거든요.



    djatjdfjj&&좋은날 입니다&&맞습니다다.&&참 좋은 날 이버ㅣㄴ4ㅏ

    위 처럼요

    물론 '&&'요 문자가 나타나는 것은 아닙니다.제가 편의상.. 이상한 거예요.



    어떻게 해야 조 이상한 문자를 안나타나게 하죠 Trim도 안되고...

    고수님들 도와 주세요.





    왕초보 wrote:

    > 델가족 여러분 안녕 하십니까?

    > 도움을 청할까 하고 문의 드립니다.

    > 음... 메모필드를 입력하고 DBGrid로 보면 그냥 'Memo' 라고만 보이잖아요..

    > 메모를 보이게 할려고 하는데 Q/A에서 조회해서 보니 한건이 있는데...

    > 그 질문을 한 님도 에러라고... 저역시 에러..

    > 아래는 소스인데요...

    >

    > Type

    > MainMenu1: TMainMenu;

    >

    > const

    > Max_Charsize = 50;

    >

    > procedure TFm106.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

    > Field: TField; State: TGridDrawState);

    > var P : array [0..Max_charsize] of char;

    > BS : TBlobStream;

    > S : string;

    > begin

    > if field is TMemoField then begin

    > with (sender as TDBgrid).canvas do begin

    > Bs:= TBlobStream.create(SQL106Notes, bmReab);

    > Fillchar(P,Sizeof(P),#0);

    > Bs.read(P,MAX_CHARSIZE);

    > BS.Free;

    > s := strpas(P);

    > while Pos(#13,s)> 0 do

    > s[Pos(#13,s)] := ' ';

    > while Pos(#10, S) > 0 do

    > s[Pos(#10,s)] := ' ';

    > Fillrect(Rect);

    > end;

    > end;

    > end;

    >

    > 소스는 이런데요 이것이 DBGrid에 메모를 어떻게 나타내나요?

    > 메모가 한줄 일 경우, 2줄 이상일 경우 어떻게 나타내죠?

    >

    > 음 저는 그리드에 데이타가 많을 경우 한줄, 또는 한줄이 길 경우 어느정도

    > 잘라서 나타내고 싶거든요.

    >

    > 여러 고수님들의 아낌없는 성원 바랍니다.

    >

    >

  • Profile
    바보감자 2001.01.31 19:56
    왕초보 wrote:

    > 답변이 없서서 생각을 했어요

    > onCalcFields 이벤트를 활용 하자고...

    > 그래서 Calc 이벤트에서 변수 Memo를 String으로 주고

    > 그 변수에 메모필드를 대입했죠

    > memo := copy(SQL106.fieldbyname('memo').asstring, 1, 100);

    > 그리고 Query 에 임시필드를 한개 만들어 주었어요 ma_memo 라고.

    > 이제 대입,

    > Query.fieldbyname('ma_memo').asstring := memo;

    > 그리고 쿼리의 메모필드는 Visible을 False로 임시필드는 True로...

    >

    > 정리하면

    >

    > procedure TFm106.Query1CalcFields(DataSet: TDataSet);

    > var memo : string;

    > begin

    > memo := copy(Query1.fieldbyname('memo').asstring, 1, 100);

    > Query1.fieldbyname('ma_memo').asstring := memo;

    > end;

    >

    > end.

    >

    > 근데 또다른 문제가 저를 반깁니다.

    > 그리드로 오픈해서 보면 그리드 한 셀에 Text가 보이는데(원래 메모에 5줄의 데이타가 있음)

    > djatjdfjj

    > 좋은날 입니다

    > 맞습니다다.

    > 참 좋은 날 이버ㅣㄴ4ㅏ

    >

    > 위처럼요...

    > 메모의 라인이 바뀌는 부분에 이상한 문자이기도 한 것이, 그림같기도 한 것이 보이

    > 거든요.

    >

    > djatjdfjj&&좋은날 입니다&&맞습니다다.&&참 좋은 날 이버ㅣㄴ4ㅏ

    > 위 처럼요

    > 물론 '&&'요 문자가 나타나는 것은 아닙니다.제가 편의상.. 이상한 거예요.

    >

    > 어떻게 해야 조 이상한 문자를 안나타나게 하죠 Trim도 안되고...

    > 고수님들 도와 주세요.

    >

    >

    > 왕초보 wrote:

    > > 델가족 여러분 안녕 하십니까?

    > > 도움을 청할까 하고 문의 드립니다.

    > > 음... 메모필드를 입력하고 DBGrid로 보면 그냥 'Memo' 라고만 보이잖아요..

    > > 메모를 보이게 할려고 하는데 Q/A에서 조회해서 보니 한건이 있는데...

    > > 그 질문을 한 님도 에러라고... 저역시 에러..

    > > 아래는 소스인데요...

    > >

    > > Type

    > > MainMenu1: TMainMenu;

    > >

    > > const

    > > Max_Charsize = 50;

    > >

    > > procedure TFm106.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

    > > Field: TField; State: TGridDrawState);

    > > var P : array [0..Max_charsize] of char;

    > > BS : TBlobStream;

    > > S : string;

    > > begin

    > > if field is TMemoField then begin

    > > with (sender as TDBgrid).canvas do begin

    > > Bs:= TBlobStream.create(SQL106Notes, bmReab);

    > > Fillchar(P,Sizeof(P),#0);

    > > Bs.read(P,MAX_CHARSIZE);

    > > BS.Free;

    > > s := strpas(P);

    > > while Pos(#13,s)> 0 do

    > > s[Pos(#13,s)] := ' ';

    > > while Pos(#10, S) > 0 do

    > > s[Pos(#10,s)] := ' ';

    > > Fillrect(Rect);

    > > end;

    > > end;

    > > end;

    > >

    > > 소스는 이런데요 이것이 DBGrid에 메모를 어떻게 나타내나요?

    > > 메모가 한줄 일 경우, 2줄 이상일 경우 어떻게 나타내죠?

    > >

    > > 음 저는 그리드에 데이타가 많을 경우 한줄, 또는 한줄이 길 경우 어느정도

    > > 잘라서 나타내고 싶거든요.

    > >

    > > 여러 고수님들의 아낌없는 성원 바랍니다.

    > >

    > >







    안녕하세여 바보감자입니다...

    제가 보기에는 그렇케 힘든 코딩 하지 마시구요..^^;;

    디비 그리드에서 그쪽으로 쎌로 포커스가 이동하믄

    디비그리두 안에. 메모 콤포가 보이면서 거기다가뿌려주면 간단할듯...

    참고만 하세여 ^^

    그리구 님이 원하신거..

    && 만 안나오게 하는거

    함수하나쓰세요...

    Length()요거....

    제가 예전에 소수점 빼면서 00을 붙이는 함수를 만들어봐서..

    랭스값으로.. 전부다 몇 자리수인지 센다음에..

    한글은(2자리)

    반복문 하나 돌리세여...

    한자리씩 카피 해가면서..

    && 면. 그 자리번호를 입력 해놓았다가.

    나중에 카피 함수로 그자리만 빼서. 출력.

    .............

    이해 가실런지..^^;;;이궁이궁....

    허접 답변이였습니다...

    즐코하세여...제가 보기에는 위에 설명드린

    메모 콤포를 보여주게 하심이 좋을듯...또 입력 할때구

    그 메모 콤포에서 입력 하문 되니까...

    상당히 편하구요...

    ~~~~













  • Profile
    왕초보 2001.01.31 20:49
    바보감자님 제글을 읽고 답 해주셔서 감사 합니다.

    Q/A를 자주 애용 하다보니 바모감자 란 이름을 많이 봤어요

    질문도 많이하고, 답변도 많이하고.... 이제 이름을 바꾸는 것이 어떨까요

    많은 사람에게 도움을 주니 모든 사람이 먹을 수 있는 왕감자로....



    초보가 메모필드로 작업을 하나 하려 했더니 참 어려움이 많네요.

    그리드에 포커스가 이동하면 메모컴포가 살짝 떠서 내용을 보여주면 금상첨화인데

    초보라 몰겠어요

    그리고 수정도 않되드라고요. 그리드를 클릭해서 폼의 메모콤포에 최초 입력된 내용이

    정확히 나타나는데 그넘을 수정 하니까 으....으... 수정이 않되드라고요...

    확~~~ 그냥 메모콤포 확 버리고 Edit를 10개정도 놓고 해야 할까봐요.

    엉~ 엉~ 초보의 설움, 고통, 오늘 하루 노력해보고 않되면 아니 못하면

    Edit 로 바꾸고 다시 조용히 산속으로 들어가 테스트하며 내공을 쌓은뒤

    반드시 팁란에 초보들을 위해 쉬운 문자로 올리리라...



    바보감자님을 포함한 고수님들 한 말씀이나마 도와 주세요...