Q&A

  • 도와주세요 ㅠ.ㅠ TListView
TlistView 의 Column 을 클릭할때마다 소팅이 되도록 구현하였습니다.

일단 데이타들은 TCollection 객체에 들어있고요..
TCollection 에 있는 놈들은 TList 에 전부다 Add 되어 있는 상태입니다.

ListPositions 는 TListView고요
FPositions 는 TList 입니다.

<!--CodeS-->
ListPositions.Items.Count:= FPositions.Count;
ListPositions.Refresh;
<!--CodeE-->


그리고 Column 을 클릭했을 때 이벤트에 다음과 같이 연결했습니다.
<!--CodeS-->

var
  iAccorDec : Integer = 1;
  iColIndex : Integer = 0;

function CompareList(Item1, Item2:Pointer):Integer;
var
  aItem1, aItem2 : TPositionItem;
  stValue1, stValue2 : String;

  //  inner Function
  function ValueCompare(Value1, Value2: Double): Integer; overload;
  begin
    if Value1 > Value2 then Result:= 1
    else if Value1 < Value2 then Result := -1
    else Result:= 0;
  end;
  function ValueCompare(Value1, Value2: Integer): Integer; overload;
  begin
    if Value1 > Value2 then Result:= 1
    else if Value1 < Value2 then Result := -1
    else Result:= 0;
  end;
begin
  // TypeCast
  aItem1:= TPositionItem(Item1);
  aItem2:= TPositionItem(Item2);

  case iColIndex of
    0 :
    begin
      if Pos(aItem1.Desc[1], 'F') > 0 then
        Result := -1
      else if Pos(aItem2.Desc[1], 'F') > 0 then
        Result := 1
      else
        Result := CompareStr(aItem1.Desc, aItem2.Desc);
    end;
    1 :
    begin
      Result := CompareStr(stValue1, stValue2);

      if Result = 0 then
        Result:= ValueCompare(aItem1.Count, aItem2.Count);
    end;
    2 : Result:= ValueCompare(aItem1.Count, aItem2.Count);
    3 : Result:= ValueCompare(aItem1.PrevCount, aItem2.PrevCount);
  end;

  Result:= Result * iAccorDec;
end;

procedure TVCCForm.ListPositionsColumnClick(Sender: TObject;
  Column: TListColumn);
var
  i, iSelect : Integer;
  aItem : TListItem;
  stSelect : String;
begin
  iColIndex := Column.Index;

  iSelect := ListPositions.SelCount;
  if iSelect > 0 then
  begin
    aItem := ListPositions.Selected;
    stSelect := aItem.Caption;
  end;

  // 아이콘 변경
  for i:= 0 to ListPositions.Columns.Count-1 do
  begin
    if (i=Column.Index) then Continue;
    ListPositions.Columns[i].ImageIndex:= -1;
  end;

  if ListPositions.Columns[Column.Index].ImageIndex < 0 then
  begin
    ListPositions.Columns[Column.Index].ImageIndex:= 1;
    iAccorDec:= -1;
  end
  else
  begin
    ListPositions.Columns[Column.Index].ImageIndex:=
        1 - ListPositions.Columns[Column.Index].ImageIndex;
    iAccorDec:= 0 - iAccorDec;
  end;

  FPositions.Sort(CompareList);

  ListPositions.Items.Count := FPositions.Count;
  if iSelect > 0 then
  begin
    for i:=0 to ListPositions.Items.Count-1 do
    begin
      aItem := ListdPositions.Items.Item[i];

      if CompareStr(stSelect, aItem.Caption) = 0 then
      begin
        ListPositions.Selected := aItem;
        break;
      end;
    end;
  end;

  ListPositions.Refresh;
end;

<!--CodeE-->

그런데 이놈이 ListView 에 표시되는 항목이 하나만 있는 경우 에러가 발생하는데요.

왜 그런지 봤더니 Sort 시 CompareList 함수안에 들어갈때,
Item1에 해당하는 부분이 이상한 주소값으로 넘어와서 메모리 접근 에러가 발생하는겁니다.

도대체 왜 그럴까요?? 혹시 아시는분 계시면 좀 알려주세요 ㅠ.ㅠ

4  COMMENTS
  • Profile
    이정욱 2008.07.30 08:50
    ItemCount가 1일때는...그냥 Exit 하게 하시면 문제 없을거 같은데요 ^^
  • Profile
    KDDG_Hit 2008.07.30 19:26
    그게 그런 꽁수를 쓰면 안되는 로직이라서요..

    그것보다 큰 문제는 제가 테스트겸 따로 만든 프로그램에서는 Count 가 1일때도 Sorting 시 이런 에러가 발생하지 않았거든요..
    ㅠ.ㅠ

    도무지 이런 경험은 처음이라...
  • Profile
    최용일 2008.07.30 21:01
    코딩에는 특별히 이상이 없는것 같은데요...
    어차피 Item Count가 1이면 Sort할때 Compare함수로 넘어가는 Item1, Item2가 똑같이 그 한개의 아이템을 가리키게 되니까 if문으로 체크할 필요는 없구요...
    Sort이전에 리스트에 있는 아이템이 문제가 있는것 같습니다.
  • Profile
    KDDG_Hit 2008.08.01 17:55
    리스트에 있는 아이템이 문제라는게 저도 이상합니다.

    리스트상에 있는건 CollectionItem 한개가 들어있는거거든요.

    리스트에 들어있는 CollectionItem 형태는 이렇습니다.
    <!--CodeS-->
    TPositionItem = class(TCollectionItem)
    public
    Symbol : TSymbolItem;
    Count : Integer;
    PrevCount : Integer;

    Positions : TCollection;

    constructor Create(aColl : TCollection); override;
    destructor Destroy; override;
    end;
    <!--CodeE-->

    그리고 이 CollectionItem 에 있는 Positions 라는 Collection 은 다음의 CollectionItem 형태를 포함합니다.

    <!--CodeS-->
    TListPositionItem = class(TCollectionItem)
    public
    Count : Integer;
    PrevCount : Integer;
    end;
    <!--CodeE-->

    List 에 들어있는 Item 에 문제가 있다면.. Sorting 이외의 다른 로직부분에서도 에러가 발생해야 할거 같은데. 다른 부분은 전혀 아무런 문제가 없거든요.. -_-;

    • 인레인
    • 2008.08.05 05:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 깔쌈보이
      2008.08.05 18:53
      말씀하신 형태의 구조로 개발을 하시면 유지관리에 있어서 여러가지 문제가 동반될것입니다. 조그만 캡...
    • Crazy™
      2008.08.07 19:23
      일반적으로 모듈별로 나눠서 하죠. 깔삼보이님 말처럼 개별개별 dll로 작업해서 호출을 하던가, 또는 ...
    • Jung
    • 2008.08.04 20:01
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 깔쌈보이
      2008.08.05 18:59
      델파이 7의 한계가 아닌가 합니다. 기존 컴포넌트를 교체하지 않으시면 거의 불가능하지 않을까 합니다....
    • 홍성락
      2008.08.06 22:31
      그쵸...기존걸 조금 수정하고 기존 검포넌트도 유지하면서 델파이 내부 api로만 하기엔 어렵습니다. 거...
    • 김영석
    • 2008.08.04 17:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.05 23:58
      Rave 컴포넌트도 업그레이드되어서 어느정도 변경이 있을 수 있겠지만... 버전에 맞게 새로 구매해서 사...
    • 델피
    • 2008.08.03 23:27
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 장종운
    • 2008.08.02 18:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장종운
      2008.08.02 19:29
      initialization OleInitialize(nil); 를 삽입하면 된다는데 어디에 넣는지 좀 가르쳐 주세요 ~
    • 장성호
      2008.08.05 00:09
      음... 원인은 그것이 아닌것 같습니다. 아래 링크를 참조하세요 http://cbuilder.borlandforum.com/i...
    • 이정욱
      2008.08.08 22:05
      인디의 http 컴포넌트를 사용하시면 됩니다. var Stream: TFileStream; URL: string; FileNa...
    • 이승우
      2008.08.08 22:11
      감사합니다^^ 아직 시간이 안 되서 테스트는 못해보았지만, 커다란 기대를 해 봅니다. 축복 많이 받...
    • 이승우
      2008.08.09 20:54
      다시 한번 감사드립니다. 다운되는 것을 확인했습니다. 그런데, 다운 받는 상황을 볼 수가 없어서 ...
    • 이정욱
      2008.08.09 22:38
      OnWork 이벤트를 이용하세요..
    • 정명수
      2010.07.01 03:21
      다른 파일을 받으려고 하면 안되나요 ? *.stp(3D 캐드파일) 파일을 해봤더니 에러가 나네요. ...
    • 석주현
      2008.08.02 19:32
      음 그냥 regsrv32.exe 유틸을 이용해서 프로그램 설치 시에 수동으로 flash9f.ocx 를 설치하면 됩니다. ...
    • 이승우
      2008.08.02 21:40
      빠른 답변에 감사를 드립니다. 축복 받으실 꺼에요^^ 제가 만든 플을 배포하려고 하는데 수동으로 ...
    • 석주현
      2008.08.03 04:18
      uses 절에 ComObj를 추가하시고 RegisterComServer('flash9f.ocx'); 아래와 같이 해서 코드로 등록...
    • 김호정
    • 2008.08.01 19:47
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.01 20:57
      흠.... 리얼그리드에 데이터를 입력할 때 20081024를 2008-10-24로 변경해서 입력해주시면 될것 같은데요...
    • 김호정
      2008.08.01 21:03
      데이터를 쿼리에서 불러오는거라서여;; 수정은 안되여;;; 리얼그리드에다가 넣기만 하는거라..수정이 안...
    • 최용일
      2008.08.01 21:25
      쩝~ 같은말인데요... 쿼리 결과를 불러서 코딩으로 넣어주는 것이라면 위와 같이 하시면 될것같구요... ...
    • 김호정
      2008.08.01 22:12
      아....그렇군요.!! SELECT nvl(START_DATE,' '),nvl(END_DATE,' ') from T_PROGRAM SQL게이트 오...
    • 최용일
      2008.08.01 22:18
      쿼리를 바꾸는것보다는 쿼리 결과를 표현하는 방식을 바꾸는것이 더 좋을듯한데요... 쿼리를 바꾸면 쿼...
    • 최용일
      2008.08.02 05:00
      아마도 HostData[i, 8], HostData[i, 9]에 날짜가 20081024형식으로 들어 있는것 같은데.... 쩝~ 이런한...
    • 김호정
    • 2008.08.01 02:29
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.01 02:49
      퀵리포트의 OnNeedData이벤트에서 리얼그리드의 데이터를 하나씩 읽어오세요.
    • 김호정
      2008.08.01 02:52
      그렇게 하나씩 불러들이는것이... 자세히 말씀하시면 어떻게..해야되는거죠? QRlabel1.Caption : ...
    • 한기동
      2008.08.01 19:02
      저같으면~ ㅎㅎ 리얼그리드 내용을 하나씩 읽어서 퀵레포트에다 뿌리는건 좀 그러네요 리어그리드 내...
    • phono
      2008.08.01 20:05
      저도, 한기동님의 방법에 한표 드립니다. ^^ OnNeed 로 처리는 시간과 노력동원이... ㅎㄷㄷ 합니다.
    • steps
      2008.07.31 00:10
      새 ActiveX Form 프로젝트를 하나 연 다음에 닫는게 아니라 file/new/other/activex/activex form 으로 ...
    • 민성필
      2008.07.31 01:19
      답변 너무 감사합니다. ActiveX 폼 추가군요. 제가 너무 대충 봐서 몰랐는데, 이 녀석이 애초부터 Ac...
    • steps
      2008.07.31 02:07
      ??? 혹 폼파일이 아니고 프레임의 pas파일이 아닌가요? 저는 프레임에 모든걸 올려놓구 보통 폼우에 이 ...
    • 후초보
    • 2008.07.30 20:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.07.30 22:14
      아래 코드는 윈도우 전영역을 캡션바와 같이 인식하는 건데요.. 결국 윈도우를 그냥 드래그 하면 움직여...
    • 구창민
      2008.07.31 18:46
      안녕하세요.. bsSizeable 는 BoderStyle 을 말씀하시는 거겠죠? 그리고, 제목표시줄에서 드래그라 하...
    • 이영수
    • 2008.07.30 18:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.07.30 22:15
      자료실에 보시면 exif 정보를 가지고 오는 소스가 있습니다. exif로 검색해 보시면 됩니다.
    • KDDG_Hit
    • 2008.07.30 02:50
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.07.30 08:50
      ItemCount가 1일때는...그냥 Exit 하게 하시면 문제 없을거 같은데요 ^^
    • KDDG_Hit
      2008.07.30 19:26
      그게 그런 꽁수를 쓰면 안되는 로직이라서요.. 그것보다 큰 문제는 제가 테스트겸 따로 만든 프로그램...
    • 최용일
      2008.07.30 21:01
      코딩에는 특별히 이상이 없는것 같은데요... 어차피 Item Count가 1이면 Sort할때 Compare함수로 넘어가...
    • KDDG_Hit
      2008.08.01 17:55
      리스트에 있는 아이템이 문제라는게 저도 이상합니다. 리스트상에 있는건 CollectionItem 한개가 들어...
    • 최용일
      2008.07.30 21:04
      뭐... 별다른 처리를 할것은 없는것 같은데요... 파라매터를 넘겨주고 넘겨받는 방식에 따라서 약간은 ...
    • 김용일
    • 2008.07.29 01:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 가을바람
      2008.07.29 06:46
      유동ip를 고정 ip로 만들수는 없읍니다.. 고정ip는 전용선을 쓰는게 유일한방법이고요.. 전용선은 비싸...
    • 김양훈
    • 2008.07.29 00:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.07.29 02:46
      아래를 정리해서 사용하세요 <!--CodeS--> unit Unit1; interface uses Windows, Messa...
    • 홍성락
      2008.07.29 04:42
      텍스트를 저장시 UTF-8로 저장 안하면 타언어에서는 100% 읽기 어렵습니다. 만약 UTF-8코드로 저장하면 ...
    • 홍성락
      2008.07.29 05:04
      메모장에서 저장시 UTF-8로하면 타언어OS에서 메모장으로 보면 보이는데 델파이에서 보통 Memo로는 안되고 ...
    • 이정욱
      2008.07.29 08:50
      감사합니다. 그런데 위의 함수들을 응용하면 일본어로 된 파일 이름을 한글윈도우에서 제데로된 일본...
    • 양영필
      2008.07.31 19:45
      파일명을 처리하실 거라면 유니코드로 처리하면 되지 않을까요? FindFirstFileW 처럼 W붙은 유니코드 함...
    • 이정욱
      2008.08.01 03:59
      양영필님/ 그게... 실제 하드에 존재하는 파일이 아니라, 이미 압축 파일안에 저장되어있는 파일이라서요...
    • 홍성락
      2008.08.01 05:55
      그렇지요.잠깐 해보려다 지금 조금 바빠서리..디폴드론 어렵네요. 만약에 압축 파일안에 헤더가 있다면...
    • 양영필
      2008.08.01 19:25
      어째 이상하다 했네요 ㅠ.ㅜ 예전에 봤던 윈도우 API중에 MultiByteToWideChar가 있는데 혹시 찾으시...
    • • • •
    • 가을바람
      2008.07.29 06:46
      선배 !! 아니 이제 실시간방송까지..ㅎㅎㅎ
    • 이정욱
      2008.07.29 08:57
      방법은 있겠죠... 그런데 질문이 너무 간단하셔서....ㅡㅡ; 설마..실시간 방송 출력 풀 소스를 원하시...
    • 장종운
    • 2008.07.25 18:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.07.25 19:18
      Form 의 프로퍼티 창을 보시면 BorderIcons 라는 항목이 있습니다. 그 부분을 펼처 보시면 원하시...