Q&A

  • Calendar의 날짜에...
안녕하세요. Calendar의 특정날짜에 제가 원하는 그래픽을 표시해 넣고 싶은데 어떻게 하면 되나요? 예를 들면 토요일이나 일요일을 붉은색으로 표시해 넣는다던지, 혹은 기념일에 해당하는 날짜에 원하는 특별한 기호같은 것을 삽입해 넣고 싶은데요, 혹시 방법이 있다면 알려 주시겠어요?



9  COMMENTS
  • Profile
    꺄꿍 1998.11.21 03:03
    디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연결된 DBmemo 로 메모필드에 있는 데이타가 읽혀지는 속도가 너무 느려서 PC가 죽은것 처럼 가만히 있는 경우가 계속 생깁니다.

    메모필드에 들어있는 내용은 고작 한글 2~3페이지 입니다.

    그런데도 어떤 데이타는 아예 읽어오지도 못하는 군요. 그리고 메모컴포넌트는

    memo1.lines.text := query1.FieldByName('Contents').asstring;

    memo1.lines.strings[0] := query1.FieldByName('Contents').asstring;

    이렇게 해도 다운되는거 같은 현상은 마찬가지 였고,

    스트림을 이용해서 읽어보아도 마찬가지로 로딩되는 속도가 엄청 느립니다. T.T 아래처럼 사용했습니다.

    Stream := TBlobStream.Create(query1.FieldByName('Contents') as TBlobField, bmRead);

    try

    Size := Stream.Seek(0, 2);

    Stream.Seek(0, 0);

    Inc(Size);

    GetMem(Buffer, Size);

    try

    FillChar(Buffer^, Size, #0);

    Stream.Read(Buffer^, Size);

    Memo1.SetTextBuf(Buffer);

    finally

    FreeMem(Buffer, Size);

    end;

    finally

    Stream.Free;

    end;

    컴포넌트 자체에서 읽어오는 속도가 느린것인지..

    하도 신기해서 디비 익스플로러에서 그 메모필드를 열어 읽어보았더니 어떤 컴포넌트인지 몰라도 번개같이 읽혀지더군요..

    그렇게 만들수는 없는지요?

    벌써 며칠째 입니다. 쉽게 생각했다가 허벌나게 고생하고 있습니다

    고수분들의 조언을 기다리겠습니다.

  • Profile
    김영대 1999.05.31 20:17
    북해 께서 말씀하시기를...

    > 안녕하세요. Calendar의 특정날짜에 제가 원하는 그래픽을 표시해 넣고 싶은데 어떻게 하면 되나요? 예를 들면 토요일이나 일요일을 붉은색으로 표시해 넣는다던지, 혹은 기념일에 해당하는 날짜에 원하는 특별한 기호같은 것을 삽입해 넣고 싶은데요, 혹시 방법이 있다면 알려 주시겠어요?

    >



    안녕하세요 김영대입니다

    아래 예제는 제가 전에 만들었던 스케쥴관리의 일부를 발췌한건대

    폼위에는 크기가 700*500 정도의 비어있는 TImage 하고

    년월을 입력받는 TMaskEdit 와 TButton 하나를 올려놓은 다음

    아래 소스를 추가하세요

    아래 소스는 TImage에 직접 그래픽으로 달력을 그리므로 그림같은것은

    직접 Canvas 에 그리시면 됩니다



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ExtCtrls, Mask, ComCtrls, Printers;



    type

    TMainForm = class(TForm)

    Button1: TButton;

    ME_yyyymm: TMaskEdit;

    Image_Schedule: TImage;

    procedure Button1Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    procedure DrawBackGround(yyyymm: String);

    procedure DrawProgressBar(yyyymm, StartDate, EndDate: String; iColor: TColor);

    procedure DrawEvent(yyyymm, EventDate, Event: String; iColor: TColor);

    end;



    const

    DayOfWeekNames: array[0..6] of String =('일','월','화','수','목','금','토');

    NameHeight = 22;



    var

    MainForm: TMainForm;

    OccupationEvent: array[0..31] of Integer;

    OccupationBar: array[0..31] of Integer;

    MasterCanvas: TCanvas;



    implementation

    {$R *.DFM}



    procedure TMainForm.FormCreate(Sender: TObject);

    begin

    Image_Schedule.Picture.Bitmap := TBitmap.Create; {bitmap 생성}

    MasterCanvas := Image_Schedule.Picture.Bitmap.Canvas;

    ME_yyyymm.EditMask := '####.##;0;_';

    ME_yyyymm.Text := '199905';

    end;



    {===============================================================================

    주어진 년월의 마지막 일자를 구한다

    ===============================================================================}

    function Get_LastDay(yyyy,mm: Integer): Integer;

    var

    MyDate: TDateTime;

    Convert_OK: Boolean;

    dd: Integer;

    begin

    Convert_OK := True;

    dd := 28;

    while Convert_OK do

    begin

    try

    MyDate := EncodeDate(yyyy, mm, dd);

    except

    on EConvertError do

    Convert_OK := False;

    end;

    if Convert_OK then

    Inc(dd)

    else

    Dec(dd);

    end;

    Get_LastDay := dd;

    end;



    {===============================================================================

    주어진 달의 주수를 구한다(마지막 주의 의미)

    ===============================================================================}

    Function Get_weeks(yyyy,mm: Integer): Integer;

    var

    MyDate: TDateTime;

    i, weeks: Integer;

    Convert_OK: Boolean;

    begin

    weeks := 0;

    for i := 1 to 31 do

    begin

    try

    Convert_OK := True;

    MyDate := EncodeDate(yyyy, mm, i);

    except

    on EConvertError do

    Convert_OK := False;

    end;

    if Convert_OK then

    if (DayOfWeek(MyDate) = 7) or (Get_LastDay(yyyy,mm) = i) then {토요일이나 달의 마지막이면 1주}

    Inc(weeks);

    end;

    Get_weeks := weeks;

    end;



    {===============================================================================

    주어진 달의 주에 해당하는 날짜from, to, 주의 첫번째 날의 요일번호를 구한다

    ===============================================================================}

    procedure Get_weekfrto(yyyy,mm,week:Integer; var weekfrom:Integer; var weekto:Integer; var dayweek:Integer);

    var

    MyDate: TDateTime;

    i, j, weeks: Integer;

    Convert_OK: Boolean;

    begin

    weekfrom := 0;

    weekto := 0;

    dayweek := 0;



    weeks := 0;

    for i := 1 to 31 do

    begin

    try

    Convert_OK := True;

    MyDate := EncodeDate(yyyy, mm, i);

    except

    on EConvertError do

    Convert_OK := False;

    end;

    if Convert_OK then

    begin

    if (DayOfWeek(MyDate) = 7) or (Get_LastDay(yyyy,mm) = i) then {토요일이나 달의 마지막이면 1주}

    Inc(weeks);

    if weeks = week then

    begin

    weekto := i; {주의 마지막 일자}

    for j := i downto 1 do

    begin

    MyDate := EncodeDate(yyyy, mm, j);

    if (DayOfWeek(MyDate) = 1) or (j = 1) then {일요일이나 그달의 1일이면 주의 시작 일자}

    begin

    weekfrom := j; {주의 시작 일자}

    dayweek := DayOfWeek(MyDate); {주의 첫번째 날의 요일번호}

    Break;

    end;

    end;

    System.Exit;

    end;

    end;

    end;

    end;



    function indc_date(yyyymmdd: String; disc: Integer): String;

    var

    yyyy,mm,dd: Integer;

    MyDate: TDateTime;

    Convert_OK: Boolean;

    begin

    yyyy := StrToIntDef(Copy(yyyymmdd,1,4),-1);

    mm := StrToIntDef(Copy(yyyymmdd,5,2),-1);

    dd := StrToIntDef(Copy(yyyymmdd,7,2),-1);

    if (yyyy <= 0) or (mm <= 0) or (dd <= 0) then

    begin

    indc_date := '';

    System.exit;

    end;



    if disc = 0 then

    begin

    try

    Convert_OK := True;

    MyDate := EncodeDate(yyyy, mm, dd);

    except

    on EConvertError do

    Convert_OK := False;

    end;

    if Convert_OK then

    begin

    indc_date := FormatDateTime('yyyymmdd', MyDate);

    end

    else

    begin

    indc_date := '';

    end;

    end

    else

    begin

    Convert_OK := True;

    try

    MyDate := EncodeDate(yyyy, mm, dd);

    except

    on EConvertError do

    Convert_OK := False;

    end;

    if Convert_OK then

    begin

    indc_date := FormatDateTime('yyyymmdd', MyDate+disc);

    end

    else

    begin

    indc_date := '';

    end;

    end;

    end;



    {===============================================================================

    주어진 년,월,일이 들어가는 주를 구한다

    ===============================================================================}

    Function Get_thisweek(yyyy,mm,dd: Integer): Integer;

    var

    MyDate: TDateTime;

    i, weeks: Integer;

    Convert_OK: Boolean;

    begin

    weeks := 0;

    for i := 1 to 31 do

    begin

    try

    Convert_OK := True;

    MyDate := EncodeDate(yyyy, mm, i);

    except

    on EConvertError do

    Convert_OK := False;

    end;

    if Convert_OK then

    if (DayOfWeek(MyDate) = 7) or (Get_LastDay(yyyy,mm) = i) then {토요일이나 달의 마지막이면 1주}

    begin

    Inc(weeks);

    if dd <= i then // 해당 주를 찾았다

    Break;

    end;

    end;

    Get_thisweek := weeks;

    end;



    function DayOfWeekNum(yyyymmdd: String): Integer;

    var

    yyyy,mm,dd: Integer;

    MyDate: TDateTime;

    begin

    yyyy := StrToIntDef(Copy(yyyymmdd,1,4),-1);

    mm := StrToIntDef(Copy(yyyymmdd,5,2),-1);

    dd := StrToIntDef(Copy(yyyymmdd,7,2),-1);



    Result := -1;

    try

    MyDate := EncodeDate(yyyy, mm, dd);

    Result := DayOfWeek(MyDate);

    except

    on EConvertError do

    Result := -1;

    end;

    end;



    procedure TMainForm.DrawBackGround(yyyymm: String);

    var

    max_day, max_week: Integer;

    day_width, day_height: Integer;

    weekfrom, weekto, dayweek: Integer;

    i, j, k, yyyy, mm: Integer;

    temp: String;

    begin

    yyyy := StrToIntDef(Copy(yyyymm,1,4),0);

    mm := StrToIntDef(Copy(yyyymm,5,2),0);

    if (yyyy = 0) or (mm = 0) then

    System.Exit;



    for i := Low(OccupationEvent) to High(OccupationEvent) do

    OccupationEvent[i] := 0;

    for i := Low(OccupationBar) to High(OccupationBar) do

    OccupationBar[i] := 0;



    // 달의 마지막일자

    max_day := Get_LastDay(yyyy, mm);



    // 달의 주수

    max_week := Get_weeks(yyyy, mm);



    day_width := Image_Schedule.Width div 7; // 가로 7칸의 각 폭

    day_height := (Image_Schedule.Height-NameHeight) div 6; // 세로 6칸의 각 높이



    MasterCanvas.Font := Self.Font;



    // 이전의 화면을 지운다

    Image_Schedule.Picture.Bitmap.Width := Image_Schedule.Width;

    Image_Schedule.Picture.Bitmap.Height := Image_Schedule.Height;

    MasterCanvas.Brush.Color := clBtnFace;

    MasterCanvas.FillRect(Rect(0, 0, Image_Schedule.Width, Image_Schedule.Height));



    // 각 일자명을 그린다

    MasterCanvas.Brush.Color := clYellow;

    for i := 0 to 6 do

    begin

    MasterCanvas.Rectangle(day_width*i, 0,

    day_width*(i+1), NameHeight);



    if i = 0 then // 일요일

    MasterCanvas.Font.Color := clRed

    else if i = 6 then // 토요일

    MasterCanvas.Font.Color := clBlue

    else // 평일

    MasterCanvas.Font.Color := clBlack;

    MasterCanvas.TextOut(day_width*i+5, 5, DayOfWeekNames[i]);

    end;



    // 스케줄의 각 일자의 직사각형을 그린다

    MasterCanvas.Brush.Color := clWhite;

    for i := 0 to (max_week-1) do

    begin

    for j := 0 to 6 do

    MasterCanvas.Rectangle(day_width*j, day_height*i+NameHeight,

    day_width*(j+1), day_height*(i+1)+NameHeight);



    end;



    // 스케줄의 각 일자를 출력

    k := 0;

    for i := 0 to (max_week-1) do // 달의 주수만큼

    begin

    // 주어진 달의 주에 해당하는 날짜from, to, 주의 첫번째 날의 요일번호

    Get_weekfrto(yyyy,mm,i+1, weekfrom, weekto, dayweek);

    for j := 0 to 6 do

    begin

    if ((j+1) >= dayweek) and

    ((k+1) <= max_day) then

    begin

    Inc(k);



    if j = 0 then // 일요일

    MasterCanvas.Font.Color := clRed

    else if j = 6 then // 토요일

    MasterCanvas.Font.Color := clBlue

    else // 평일

    MasterCanvas.Font.Color := clBlack;



    MasterCanvas.Brush.Color := clWhite;

    MasterCanvas.TextOut(day_width*j+5, day_height*i+5+NameHeight, inttostr(k));

    end;

    end;

    end;

    end;



    procedure TMainForm.DrawProgressBar(yyyymm, StartDate, EndDate: String; iColor: TColor);

    var

    day_width, day_height: Integer;

    daynum, dayweek: Integer;

    yyyy, mm: Integer;

    CurDate: String;

    iPos: Integer;

    begin

    yyyy := StrToIntDef(Copy(yyyymm,1,4),0);

    mm := StrToIntDef(Copy(yyyymm,5,2),0);



    if (yyyy = 0) or (mm = 0) then

    System.Exit;



    iPos := 1;

    CurDate := StartDate; // 시작일자

    while CurDate <= EndDate do

    begin

    if Copy(CurDate,1,6) = yyyymm then // 기준월의 날짜만 그린다

    begin

    // 요일에 출력되는 막대 카운트

    OccupationBar[StrToIntDef(Copy(CurDate,7,2),0)] :=

    OccupationBar[StrToIntDef(Copy(CurDate,7,2),0)] + 1;

    if iPos < OccupationBar[StrToIntDef(Copy(CurDate,7,2),0)] then // 해당기간의 최대 카운트

    iPos := OccupationBar[StrToIntDef(Copy(CurDate,7,2),0)];

    end;

    CurDate := indc_date(CurDate, 1); // 날짜증가

    end;



    day_width := Image_Schedule.Width div 7; // 가로 7칸의 각 폭

    day_height := (Image_Schedule.Height-NameHeight) div 6; // 세로 6칸의 각 높이



    CurDate := StartDate; // 시작일자

    while CurDate <= EndDate do

    begin

    if Copy(CurDate,1,6) = yyyymm then // 기준월의 날짜만 그린다

    begin

    daynum := Get_thisweek(StrToInt(Copy(CurDate,1,4)), // 해당 년월일의 주번호

    StrToInt(Copy(CurDate,5,2)),

    StrToInt(Copy(CurDate,7,2)));



    dayweek := DayOfWeekNum(CurDate); // 요일번호



    // 막대기

    MasterCanvas.Brush.Color := iColor;

    MasterCanvas.FillRect(Rect(day_width*(dayweek-1)+ 4,

    day_height*(daynum-1)+ day_height-(iPos*5)-2+NameHeight,

    day_width*(dayweek-1)+ day_width-4,

    day_height*(daynum-1)+ day_height-(iPos*5)+1+NameHeight));



    if CurDate = StartDate then // 시작점 그리기

    MasterCanvas.FillRect(Rect(day_width*(dayweek-1)+ 4,

    day_height*(daynum-1)+ day_height-(iPos*5)-2+NameHeight-1,

    day_width*(dayweek-1)+ 6,

    day_height*(daynum-1)+ day_height-(iPos*5)-2+NameHeight+1));



    if CurDate = EndDate then // 종료점 그리기

    MasterCanvas.FillRect(Rect(day_width*(dayweek-1)+ day_width-6,

    day_height*(daynum-1)+ day_height-(iPos*5)+1+NameHeight-1,

    day_width*(dayweek-1)+ day_width-4,

    day_height*(daynum-1)+ day_height-(iPos*5)+1+NameHeight+1));



    end;

    CurDate := indc_date(CurDate, 1); // 날짜증가

    end;

    end;



    procedure TMainForm.DrawEvent(yyyymm, EventDate, Event: String; iColor: TColor);

    var

    day_width, day_height: Integer;

    daynum, dayweek: Integer;

    iPos: Integer;

    begin

    if Copy(EventDate,1,6) <> yyyymm then // 기준월의 날짜에 속하지 않으면...

    System.Exit;



    // 요일에 출력되는 이벤트 카운트

    OccupationEvent[StrToIntDef(Copy(EventDate,7,2),0)] :=

    OccupationEvent[StrToIntDef(Copy(EventDate,7,2),0)] + 1;

    iPos := OccupationEvent[StrToIntDef(Copy(EventDate,7,2),0)];



    day_width := Image_Schedule.Width div 7; // 가로 7칸의 각 폭

    day_height := (Image_Schedule.Height-NameHeight) div 6; // 세로 6칸의 각 높이



    daynum := Get_thisweek(StrToInt(Copy(EventDate,1,4)), // 해당 년월일의 주번호

    StrToInt(Copy(EventDate,5,2)),

    StrToInt(Copy(EventDate,7,2)));



    dayweek := DayOfWeekNum(EventDate); // 요일번호



    MasterCanvas.Font.Color := iColor;

    MasterCanvas.Brush.Color := clWhite;

    MasterCanvas.TextOut(day_width*(dayweek-1)+ (day_width div 2) - (MasterCanvas.TextWidth(Event) div 2),

    day_height*(daynum-1)+ (iPos*13) +3+ NameHeight, Event);

    end;



    procedure TMainForm.Button1Click(Sender: TObject);

    begin

    // 기준년월의 달력을 그린다

    DrawBackGround(ME_yyyymm.Text);



    // 기준년월의 각 스케쥴과 이벤트를 그린다

    DrawProgressBar(ME_yyyymm.Text, '19990506', '19990510', clRed);

    DrawEvent(ME_yyyymm.Text, '19990507', '검토', clGreen);

    DrawEvent(ME_yyyymm.Text, '19990503', '술먹는날', clGreen);

    DrawEvent(ME_yyyymm.Text, '19990513', '술먹는날', clGreen);

    DrawEvent(ME_yyyymm.Text, '19990523', '술먹는날', clGreen);



    DrawProgressBar(ME_yyyymm.Text, '19990501', '19990505', clRed);

    DrawEvent(ME_yyyymm.Text, '19990502', '생일이브', clRed);

    DrawEvent(ME_yyyymm.Text, '19990503', '생일', clRed);



    DrawProgressBar(ME_yyyymm.Text, '19990520', '19990530', clBlue);

    DrawEvent(ME_yyyymm.Text, '19990522', '검수일', clBlue);

    DrawEvent(ME_yyyymm.Text, '19990529', '토요근무', clBlue);



    DrawProgressBar(ME_yyyymm.Text, '19990503', '19990506', clBlack);

    DrawEvent(ME_yyyymm.Text, '19990503', '시연회', clBlack);



    DrawProgressBar(ME_yyyymm.Text, '19990726', '19990726', clBlue);

    DrawEvent(ME_yyyymm.Text, '19990726', '생일', clBlue);

    end;



    end.



  • Profile
    이 재원 1999.01.05 16:56
    거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요?

    글코 크기 Value를 100에서 한 20으로 낯춰 보세요 ?? 거 이상하네... 으음...

  • Profile
    신인재 1998.11.24 02:16
    냥냥....

    쩝...이상하군요......

    디비 익스플로러에서 잘된다면

    델파이 어플에서도 잘되야 정상이거든요...

    음냐...

    메모필드라.....

    Assign메소드를 사용해 보시지요...

    Memo1.Assign(AnyMemoField);

    이런식으로요... BLOB데이타가 제법 많다고 하셨는데

    메모필드 말고도 많이 있다는 말씀인가요...?

    제 생각에 이렇게도 안되면 정말 DB의 문제일꺼 같군요...



    꺄꿍 wrote:

    > 디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연결된 DBmemo 로 메모필드에 있는 데이타가 읽혀지는 속도가 너무 느려서 PC가 죽은것 처럼 가만히 있는 경우가 계속 생깁니다.

    > 메모필드에 들어있는 내용은 고작 한글 2~3페이지 입니다.

    > 그런데도 어떤 데이타는 아예 읽어오지도 못하는 군요. 그리고 메모컴포넌트는

    > memo1.lines.text := query1.FieldByName('Contents').asstring;

    > memo1.lines.strings[0] := query1.FieldByName('Contents').asstring;

    > 이렇게 해도 다운되는거 같은 현상은 마찬가지 였고,

    > 스트림을 이용해서 읽어보아도 마찬가지로 로딩되는 속도가 엄청 느립니다. T.T 아래처럼 사용했습니다.

    > Stream := TBlobStream.Create(query1.FieldByName('Contents') as TBlobField, bmRead);

    > try

    > Size := Stream.Seek(0, 2);

    > Stream.Seek(0, 0);

    > Inc(Size);

    > GetMem(Buffer, Size);

    > try

    > FillChar(Buffer^, Size, #0);

    > Stream.Read(Buffer^, Size);

    > Memo1.SetTextBuf(Buffer);

    > finally

    > FreeMem(Buffer, Size);

    > end;

    > finally

    > Stream.Free;

    > end;

    > 컴포넌트 자체에서 읽어오는 속도가 느린것인지..

    > 하도 신기해서 디비 익스플로러에서 그 메모필드를 열어 읽어보았더니 어떤 컴포넌트인지 몰라도 번개같이 읽혀지더군요..

    > 그렇게 만들수는 없는지요?

    > 벌써 며칠째 입니다. 쉽게 생각했다가 허벌나게 고생하고 있습니다

    > 고수분들의 조언을 기다리겠습니다.





  • Profile
    꺄꿍 1998.11.24 10:22
    신인재 wrote:

    > 냥냥....

    > 쩝...이상하군요......

    > 디비 익스플로러에서 잘된다면

    > 델파이 어플에서도 잘되야 정상이거든요...

    > 음냐...

    > 메모필드라.....

    > Assign메소드를 사용해 보시지요...

    > Memo1.Assign(AnyMemoField);

    > 이런식으로요... BLOB데이타가 제법 많다고 하셨는데

    > 메모필드 말고도 많이 있다는 말씀인가요...?

    > 제 생각에 이렇게도 안되면 정말 DB의 문제일꺼 같군요...

    >

    > 꺄꿍 wrote:

    신인재님 안녕하세요

    답변 감사합니다.. 그런데.. 흑흑.. 역시 안되는 군요..

    다시 며칠을 끙끙거리다 이렇게 글을 올립니다.

    DB는 델파이 3.0의 디폴트 파라독스 입니다.

    디비 화일명은 temp.db 이구요.

    필드는 Subject(제목), Contents(내용) 이렇게 달랑 두가지 입니다.

    Subect의 타입은 Alpha 100자리구요 내용의 타입은 Memo 100자리 입니다.

    그리구 쿼리로 오픈한다음 읽어올땐 신인재 님이 가르켜 주신대로

    memo1.lines.Assign(query1.FieldByName('Contents')); 이렇게..

    제가 틀리게 사용했나요?

    Memo 컴포넌트에 읽혀져 오긴 하는데 역시 PC가 죽은 것 처럼..

    'Contents' 필드에 들어있는 내용은 한글 2~3페이지 정도입니다.

    신인재님 바쁘시겠지만 한번 테스트 안 해보시겠습니까?

    정말 느리게 읽혀집니다. 디비메모도 마찬가지구요..

    디폴트가 느리게 읽혀지는것은 어쩔수 없는 것인가요?

    메모필드에 내용이 많은것이 읽혀질때는 메모컴포넌트에 스크롤바를

    아래로 끌어내리면 글이 거꾸로 올라가는 현상까지 나옵니다.

    온갖 방법을 다 동원해도 실력이 모자라니 안되는군요..

    흑흑.. 정말 처절해서..

    포기해야 하는것인지.. 조언을 부탁드립니다.

  • Profile
    신인재 1998.11.24 22:40
    음냐....

    저두 방법이 없군요....

    이거 받아서 테스트 해보세요..

    실행파일과 소스를 함께 넣었습니다..

    꺄꿍님과 같은 디비 포맷을 쓰고 table, query콤포를

    이용한 예제입니다..그리고 엘리아스도 없습니다.

    디비파일과 어플을 한 디렉토리에 넣고 실행하세요..

    제 컴에서는 무리없이 실행이 되니 이거 실행해 보시고

    여기에서도 문제가 발생된다면

    델파이를 다시 까시던가 BDE쪽을 다시까시던가 하는 방법밖에는

    없겠군요...

    답변이 안되어 죄송합니다....T.T



    P.s 음냐 저희 bbs에 파일 첨부가 안되는 군요...

    이상하다 E-mail로 보내드리지요.....



  • Profile
    이정욱 1998.11.21 14:56
    제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요.

    리치에디트 데이터를 메모로 읽으려고 하면 엄청나게 시간이 많이 걸립니다.

    DBRichEdit을 사용하셔도 되구요, 그냥 Txt포맷으로 데이타들을 바꾼후 하셔도 될것 같네요..

    그럼..



    꺄꿍 wrote:

    > 디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연결된 DBmemo 로 메모필드에 있는 데이타가 읽혀지는 속도가 너무 느려서 PC가 죽은것 처럼 가만히 있는 경우가 계속 생깁니다.

    > 메모필드에 들어있는 내용은 고작 한글 2~3페이지 입니다.

    > 그런데도 어떤 데이타는 아예 읽어오지도 못하는 군요. 그리고 메모컴포넌트는

    > memo1.lines.text := query1.FieldByName('Contents').asstring;

    > memo1.lines.strings[0] := query1.FieldByName('Contents').asstring;

    > 이렇게 해도 다운되는거 같은 현상은 마찬가지 였고,

    > 스트림을 이용해서 읽어보아도 마찬가지로 로딩되는 속도가 엄청 느립니다. T.T 아래처럼 사용했습니다.

    > Stream := TBlobStream.Create(query1.FieldByName('Contents') as TBlobField, bmRead);

    > try

    > Size := Stream.Seek(0, 2);

    > Stream.Seek(0, 0);

    > Inc(Size);

    > GetMem(Buffer, Size);

    > try

    > FillChar(Buffer^, Size, #0);

    > Stream.Read(Buffer^, Size);

    > Memo1.SetTextBuf(Buffer);

    > finally

    > FreeMem(Buffer, Size);

    > end;

    > finally

    > Stream.Free;

    > end;

    > 컴포넌트 자체에서 읽어오는 속도가 느린것인지..

    > 하도 신기해서 디비 익스플로러에서 그 메모필드를 열어 읽어보았더니 어떤 컴포넌트인지 몰라도 번개같이 읽혀지더군요..

    > 그렇게 만들수는 없는지요?

    > 벌써 며칠째 입니다. 쉽게 생각했다가 허벌나게 고생하고 있습니다

    > 고수분들의 조언을 기다리겠습니다.





  • Profile
    꺄꿍 1998.11.22 07:30
    이정욱 wrote:

    > 제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요.

    > 리치에디트 데이터를 메모로 읽으려고 하면 엄청나게 시간이 많이 걸립니다.

    > DBRichEdit을 사용하셔도 되구요, 그냥 Txt포맷으로 데이타들을 바꾼후 하셔도 될것 같네요..

    > 그럼..

    >



    이 정욱님 우선 답변에 감사드립니다.

    그런데.. 제가 불러온 데이타는 디비화일에서 읽어온거거든요.

    필드내용은 필드이름이 Contents 이구요 형은 MEMO 구요 크기는 100으로 정해두었습니다. 저장된 데이타들은 약 600 여건이구요

    처음에 그 디비화일을 디비메모에 연결해서 바로 보여주려니까 너무 읽어오는 시간이 느리더라구요(정말 느림 - 수차례 확인한 결과입니다.) 그래서 이것저것 편법을 써보다가 그냥 메모컴포넌트를 하나 폼위에 올리고 테이블에서 읽어오기로 했지요.그랬더니 마찬가지로 너무 느리더라구요..

    느린 정도가 아예 2분정도 갈때도 있답니다.

    그리구 리치에디터 나 디비리치에디터도 사용해 보았는데 그건

    두배이상이 더 느려서 사용못하겠더라구요.. 흑흑

    지금 사용하고 있는 방법은 저번에 질문했던 대로 하고 있구요

    레코드가 이동될때마다 다시 메모에 읽혀져오게 만들어두었거든요.

    그런데.. 넘 느려서리 죽은거 처럼 보이는 경우가 넘 많아요

    델파이 관련사이트는 다 돌아다니면서 물어보았는데 아무도 가르쳐 주질

    않는군요.. 메모컴포넌트 자체가 문제인가요?

    제가 볼적에는 메모컴포넌트 자체에서 읽어오는 속도가 느린거 같아요..

    이 사태를 어떻게 해결하면 좋을까요? 조언 부탁 드립니다.

  • Profile
    이정욱 1998.11.22 20:40
    현재 사용하시는 DB포맷은 무엇입니까?

    XPower 컴포넌트 트라이얼을 받아서 한번 해보세요..

    그래도 느리면 DB에 문제가 있는것입니다. 아니면 BDE에 문제가...

    XPower는 그림과 메모도 한 그리드 안에서 표현이 가능하거든요...

    일단 테스트 해보세요..



    꺄꿍 wrote:

    > 이정욱 wrote:

    > > 제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요.

    > > 리치에디트 데이터를 메모로 읽으려고 하면 엄청나게 시간이 많이 걸립니다.

    > > DBRichEdit을 사용하셔도 되구요, 그냥 Txt포맷으로 데이타들을 바꾼후 하셔도 될것 같네요..

    > > 그럼..

    > >

    >

    > 이 정욱님 우선 답변에 감사드립니다.

    > 그런데.. 제가 불러온 데이타는 디비화일에서 읽어온거거든요.

    > 필드내용은 필드이름이 Contents 이구요 형은 MEMO 구요 크기는 100으로 정해두었습니다. 저장된 데이타들은 약 600 여건이구요

    > 처음에 그 디비화일을 디비메모에 연결해서 바로 보여주려니까 너무 읽어오는 시간이 느리더라구요(정말 느림 - 수차례 확인한 결과입니다.) 그래서 이것저것 편법을 써보다가 그냥 메모컴포넌트를 하나 폼위에 올리고 테이블에서 읽어오기로 했지요.그랬더니 마찬가지로 너무 느리더라구요..

    > 느린 정도가 아예 2분정도 갈때도 있답니다.

    > 그리구 리치에디터 나 디비리치에디터도 사용해 보았는데 그건

    > 두배이상이 더 느려서 사용못하겠더라구요.. 흑흑

    > 지금 사용하고 있는 방법은 저번에 질문했던 대로 하고 있구요

    > 레코드가 이동될때마다 다시 메모에 읽혀져오게 만들어두었거든요.

    > 그런데.. 넘 느려서리 죽은거 처럼 보이는 경우가 넘 많아요

    > 델파이 관련사이트는 다 돌아다니면서 물어보았는데 아무도 가르쳐 주질

    > 않는군요.. 메모컴포넌트 자체가 문제인가요?

    > 제가 볼적에는 메모컴포넌트 자체에서 읽어오는 속도가 느린거 같아요..

    > 이 사태를 어떻게 해결하면 좋을까요? 조언 부탁 드립니다.





    • Heaven
    • 1999.05.31 21:14
    • 2 COMMENTS
    • /
    • 0 LIKES
    • rambo
      1999.06.01 01:19
      Heaven 께서 말씀하시기를... > 안녕하세요... > 항상 도움을 받는군요.. > > 다름이 아니라..Date형...
    • Heaven
      1999.06.01 04:07
      안녕하세요. 답변해 주셔서 고맙습니다.. 문제를 해결했네요.. 그럼..
    • 이정욱
      1998.12.07 21:49
      음.. 정확하게 해보지는 못했습니다. 그런데 이것을 쓰면 어떨까요? FieldValues 예를들면.. Customers...
    • 박성진
      1998.12.09 02:50
      위의 질문을 다시하겠습니다. 마이크로소프트 Access97을 이용해서 데이터베이스를 구축하였습니다. 마이...
    • july
    • 1999.05.31 19:44
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1998.12.07 21:49
      음.. 정확하게 해보지는 못했습니다. 그런데 이것을 쓰면 어떨까요? FieldValues 예를들면.. Customers...
    • 박성진
      1998.12.09 02:50
      위의 질문을 다시하겠습니다. 마이크로소프트 Access97을 이용해서 데이터베이스를 구축하였습니다. 마이...
    • 꺄꿍
    • 1998.11.25 02:08
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이현신
      1999.05.31 19:20
      어떤 시스템의 고유의 시리얼이나 스트링을 구할수는 없나요?.. 하드의 시리얼넘버는 포멧하면 변하고.. ...
    • 글쎄요.
      1999.06.01 01:30
      이현신 께서 말씀하시기를... > 어떤 시스템의 고유의 시리얼이나 스트링을 구할수는 없나요?.. > 하드의...
    • 김영대
      1999.05.31 21:05
      이현신 께서 말씀하시기를... > 어떤 시스템의 고유의 시리얼이나 스트링을 구할수는 없나요?.. > 하드의...
    • 1999.05.31 20:41
      정성호 께서 말씀하시기를... > 안녕하세요.. 꾸벅 ^^ > > 하나 여쭤볼게 있어서 이리 글을 올립니다....
    • 1999.05.31 20:43
      정성호 께서 말씀하시기를... > 안녕하세요...^^ 꾸벅... > > 여러가지로 부족한 점이 많아서 이리 글...
    • 북해
    • 1999.05.31 18:09
    • 9 COMMENTS
    • /
    • 0 LIKES
    • 꺄꿍
      1998.11.21 03:03
      디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연...
    • 김영대
      1999.05.31 20:17
      북해 께서 말씀하시기를... > 안녕하세요. Calendar의 특정날짜에 제가 원하는 그래픽을 표시해 넣고 싶은...
    • 이 재원
      1999.01.05 16:56
      거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요? 글코 크기 Value를 100에서 ...
    • 신인재
      1998.11.24 02:16
      냥냥.... 쩝...이상하군요...... 디비 익스플로러에서 잘된다면 델파이 어플에서도 잘되야 정상이거든요...
    • 꺄꿍
      1998.11.24 10:22
      신인재 wrote: > 냥냥.... > 쩝...이상하군요...... > 디비 익스플로러에서 잘된다면 > 델파이 어플에...
    • 신인재
      1998.11.24 22:40
      음냐.... 저두 방법이 없군요.... 이거 받아서 테스트 해보세요.. 실행파일과 소스를 함께 넣었습니다.....
    • 이정욱
      1998.11.21 14:56
      제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. 리치에디트 데이터를 메모로 읽으려고 ...
    • • • •
    • 하명훈
    • 1999.05.31 15:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 1999.05.31 20:48
      하명훈 께서 말씀하시기를... > delphi3.0으로 db를 엑세스하는 프린트폼을 Quick Report로 만들었습니다...
    • 한 재
    • 1999.05.31 14:49
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김태균
      1999.05.31 18:02
      내용을 보니 체인지 이벤트가 일어날 때 combo의 내용에 들어 있는 파일의 이름을 불러서 메모에 내용을...
    • 1999.05.31 17:56
      한 재 께서 말씀하시기를... > 가르쳐주신 것을 바탕으로 맹글어봤는데 컴파일이 안되는군요. > 문제...
    • 꺄꿍
    • 1998.11.21 03:03
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 이 재원
      1999.01.05 16:56
      거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요? 글코 크기 Value를 100에서 ...
    • 신인재
      1998.11.24 02:16
      냥냥.... 쩝...이상하군요...... 디비 익스플로러에서 잘된다면 델파이 어플에서도 잘되야 정상이거든요...
    • 꺄꿍
      1998.11.24 10:22
      신인재 wrote: > 냥냥.... > 쩝...이상하군요...... > 디비 익스플로러에서 잘된다면 > 델파이 어플에...
    • 신인재
      1998.11.24 22:40
      음냐.... 저두 방법이 없군요.... 이거 받아서 테스트 해보세요.. 실행파일과 소스를 함께 넣었습니다.....
    • 이정욱
      1998.11.21 14:56
      제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. 리치에디트 데이터를 메모로 읽으려고 ...
    • 꺄꿍
      1998.11.22 07:30
      이정욱 wrote: > 제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. > 리치에디트 데이터...
    • 이정욱
      1998.11.22 20:40
      현재 사용하시는 DB포맷은 무엇입니까? XPower 컴포넌트 트라이얼을 받아서 한번 해보세요.. 그래도 느리...
    • 변대섭
      1999.06.02 19:13
      장헌영 께서 말씀하시기를... > Ttable,Tdatasource,TDBgrid 이렇게 세 가지를 사용해서 oracle7.3 의 한 ...
    • 1999.05.31 18:54
      장헌영 께서 말씀하시기를... > Ttable,Tdatasource,TDBgrid 이렇게 세 가지를 사용해서 oracle7.3 의 한 ...
    • 김태균
      1999.05.31 18:11
      장헌영 께서 말씀하시기를... > Ttable,Tdatasource,TDBgrid 이렇게 세 가지를 사용해서 oracle7.3 의 한 ...
    • 박성훈
    • 1999.05.31 04:37
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 꺄꿍
      1998.11.21 03:03
      디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연...
    • 이 재원
      1999.01.05 16:56
      거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요? 글코 크기 Value를 100에서 ...
    • 신인재
      1998.11.24 02:16
      냥냥.... 쩝...이상하군요...... 디비 익스플로러에서 잘된다면 델파이 어플에서도 잘되야 정상이거든요...
    • 꺄꿍
      1998.11.24 10:22
      신인재 wrote: > 냥냥.... > 쩝...이상하군요...... > 디비 익스플로러에서 잘된다면 > 델파이 어플에...
    • 신인재
      1998.11.24 22:40
      음냐.... 저두 방법이 없군요.... 이거 받아서 테스트 해보세요.. 실행파일과 소스를 함께 넣었습니다.....
    • 이정욱
      1998.11.21 14:56
      제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. 리치에디트 데이터를 메모로 읽으려고 ...
    • 꺄꿍
      1998.11.22 07:30
      이정욱 wrote: > 제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. > 리치에디트 데이터...
    • • • •
    • 박성훈
    • 1999.05.31 04:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.05.31 05:38
      아래 말씀하신것은 전혀 컴포트와 상관이 없습니다. 달려있는 프린터의 제어코드들마다 틀립니다. 또, 프...
    • eojin
    • 1999.05.31 02:42
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.05.31 05:42
      쩝.. 대단한 대답은 아니구요... ASyncProfessional 이라는 컴포넌트가 있는데 이것안에 VT100, ANSI 처리...
    • 신호철
    • 1999.05.31 01:18
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 꺄꿍
      1998.11.21 03:03
      디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연...
    • 이 재원
      1999.01.05 16:56
      거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요? 글코 크기 Value를 100에서 ...
    • 신인재
      1998.11.24 02:16
      냥냥.... 쩝...이상하군요...... 디비 익스플로러에서 잘된다면 델파이 어플에서도 잘되야 정상이거든요...
    • 꺄꿍
      1998.11.24 10:22
      신인재 wrote: > 냥냥.... > 쩝...이상하군요...... > 디비 익스플로러에서 잘된다면 > 델파이 어플에...
    • 신인재
      1998.11.24 22:40
      음냐.... 저두 방법이 없군요.... 이거 받아서 테스트 해보세요.. 실행파일과 소스를 함께 넣었습니다.....
    • 이정욱
      1998.11.21 14:56
      제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. 리치에디트 데이터를 메모로 읽으려고 ...
    • 꺄꿍
      1998.11.22 07:30
      이정욱 wrote: > 제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. > 리치에디트 데이터...
    • • • •
    • 이정욱
      1999.05.31 05:40
      말씀하신 부분은 오토마타 입니다. 오토마타를 구현하셔야 하는데 워낙 양이 방대합니다. 여러군데에서 ...
    • 문창완
      1999.06.02 01:30
      이정욱 께서 말씀하시기를... > 말씀하신 부분은 오토마타 입니다. > 오토마타를 구현하셔야 하는데 워낙...
    • 영인
    • 1999.05.30 22:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.05.31 05:51
      Chart가 무슨 Chart를 사용하시는지... Series에 Clear라는 메소드나 Count라는 프로퍼티가 있다면 그것을...
    • 꺄꿍
      1998.11.21 03:03
      디비 그리드를 아래로 계속 내리거나 올리면 BLOB필드에 데이타가 제법 많이 들어있는 경우 데이타 셋에 연...
    • 이 재원
      1999.01.05 16:56
      거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요? 글코 크기 Value를 100에서 ...
    • 신인재
      1998.11.24 02:16
      냥냥.... 쩝...이상하군요...... 디비 익스플로러에서 잘된다면 델파이 어플에서도 잘되야 정상이거든요...
    • 꺄꿍
      1998.11.24 10:22
      신인재 wrote: > 냥냥.... > 쩝...이상하군요...... > 디비 익스플로러에서 잘된다면 > 델파이 어플에...
    • 신인재
      1998.11.24 22:40
      음냐.... 저두 방법이 없군요.... 이거 받아서 테스트 해보세요.. 실행파일과 소스를 함께 넣었습니다.....
    • 이정욱
      1998.11.21 14:56
      제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. 리치에디트 데이터를 메모로 읽으려고 ...
    • 꺄꿍
      1998.11.22 07:30
      이정욱 wrote: > 제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. > 리치에디트 데이터...
    • • • •