Q&A

  • AssignFile에 대한질문(세번째 올리는 군요)

AssignFile 을 사용해서 연결하는 과정입니다.
델파이 2에서 만들었던 소스를 델파이 5에서 사용하고자 하는데
에러가 발생하는 군요.

델파이 5에서 다음 과정에 문제가 있는지 봐 주십시오.

TYPE
    record = TXY
        A1, A2, A3: Integer;
        X, Y:       Double;
    end;

procedure RRead;
var
    AD:     PChar;
    AM, AN: Integer;
    FoT:    File of TXY;
begin
    // C폴더에 있는 C의 Data폴더에 있는 Point.dat파일(TXY 타입)을 연결해서 AD메모리에 넣는다.
    AssignFile(FoT, 'C:DataPoint.Dat');
    ReSet(FoT);
    AM := FileSize(SS);
    AN := AM - 1;
    AD := AllocMem(AM * Sizeof(TXY));
    BlockWrite(FoT, AD^, AN+1);
    CloseFile(FoT);
end;                

디버깅할때, 커서를 AssignFile(); 라인 끝에 가져가면 'Inaccessible value'라는
툴팁 메세지가 나옵니다.
레코드로 선언한 타입은 AssignFile을 사용할 수 없는 건가요?
고수님들의 한 수 지도 부탁 드립니다.
여기에 세번째 올리는 건데 아무도 대답을 안 해 주시는군요.

델파이 5를 전혀 사용하지 못하고 하드의 공간만 차지 하고 있습니다.
2  COMMENTS
  • Profile
    버섯 2002.01.18 03:06
          TXY = record 인데 타이핑을 잘못하신거죠?

          AM := filesize(FoT); 를 잘못 친거구요?

    그것은 당연한거구요.. 리턴값을 표시할수 없을때 나오는 메세지입니다.

    <-- 당연히 사용하실수 있습니다.

    델파이 5에서 님의 소스를 그래로 복사해서 해보니까 문제없는데요..
    근데... 로직자체가 이상하네요...
    메모리를 할당해서.. 그것을 기냥 파일에다가 엎어 쓰는건가여?

    아래 소스
    ----------------

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;

    type
      TXY = record
            A1, A2, A3: Integer;
            X, Y:       Double;
      end;

      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure rRead;
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.RRead;
    var
        AD:     PChar;
        AM, AN: Integer;
        FoT:    File of TXY;
    begin
        // C폴더에 있는 C의 Data폴더에 있는 Point.dat파일(TXY 타입)을 연결해서 AD메모리에 넣는다.
        AssignFile(FoT, 'c:aa.Dat');
        ReSet(FoT);
        AM := FileSize(fot);  <-- 여기서는 레코드의 개수를 리턴하더군요 ^^
        AN := AM - 1;
        AD := AllocMem(AM * Sizeof(TXY));
        BlockWrite(FoT, AD^, AN+1);
        CloseFile(FoT);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        RRead;
    end;

    end.

    이렇게 해보니 aa.dat
    --------------------------
                                                                    dfdasfdfdasf
    aaa

    로서 이상없이 동작했습니다....

    그러니까.. 님께서는 Syntax-Error 하고..알고리즘이 이상한거 같아여~

    참고가 되었기를~~~
  • Profile
    김훈배 2002.01.18 20:40
    님의 답변에 감사 드립니다.
    지적해 주신 코딩의 에러는 옮기면서 잘못된 것이 맞습니다.
    그리고 말씀 하신것처럼 읽어서 메모리에 그대로 없어 쓰는 부분입니다.

    죄송하지만 한번 더 수고 해 주시면 감사 하겠습니다.
    아래와 같이 코딩을 했을때,
    실행은 됩니다 하지만 RR로 읽어보면 원하는 값이 들어 있지 않습니다.
    AM, AN의 갯수 또한 다릅니다.
    참고로 델파이2에서는 정상적인 데이타가 나옵니다.
    4에서도 정상이었는데, 5와 6에서는 쓰레기 값이 나옵니다.
    델파이가 버젼업 되면서 달라진게 있나요?

    unit Assign;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Buttons, StdCtrls;

    type
            TXY = record
                    A1, A2, A3:        Integer;
                    X, Y:                Double;
            end;

            
      TForm1 = class(TForm)
            SpeedButton1: TSpeedButton;
            procedure SpeedButton1Click(Sender: TObject);
      private
            { Private declarations }
      public
            { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}


    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
            AD:        PChar;
            AM, AN, i: Integer;
            SS:              File of TXY;
            RR:           TXY;
    begin
            AssignFile(SS, 'c:datapoint3.dat');
            ReSet(SS);
            AM := FileSize(SS);       <-- 들어 있는 갯수가 델파이2에서와는 다릅니다.  
            AN := FileSize(SS) - 1;
            AD := AllocMem(AM * Sizeof(TXY));
            BlockRead(SS, AD^, AN+1);  <-- Write를 Read로 바꾸었습니다.
            CloseFile(SS);

            for i := 0 to AN do
                    begin
                    CopyMemory(@RR, @AD[i * Sizeof(TXY)], Sizeof(TXY));
                            <-- RR() 레코드 모두 쓰레기값이 들어 있습니다.
                    end;
    end;

    end.
    • 채승호
      2002.01.18 04:58
        TNS 에러는 오라클에서 나는 에러입니다...   오라클 환경 SQL*Net Easy Config...
    • 구철수
      2002.01.18 05:40
      이런, 그런게 아닌데... -_-; Zeos콤포넌트를 사용하면 SQL*Net  깔지않고 오라클 서버와 통...
    • 머슴
      2002.01.19 04:08
      미안하네여
    • Delphi Kim
    • 2002.01.18 03:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2002.01.19 00:38
      답변이라기 보다 제안인데요.. TButton 에서는 글씨에 색지정이 어렵습니다. 차라리 button과 ...
    • 돌멩이
      2002.01.20 07:37
      >안녕하세요? >초보입니다. >뭔가 만들어 볼까 싶어서요. >딴게 아니고... >어떤 특정한 프로그램에서 ...
    • 조장선
    • 2002.01.18 03:33
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 씨나락
      2002.01.18 04:04
      1. 모두 몇개의 레코드가 나온건지 알구 싶구요...    가) DBGrid에서 레코드 갯수 가져오는법 ...
    • 조장선
      2002.01.18 05:56
      정말 감사합니다... 해결 할것 같아요... 전 공부하면서 query1. 이렇게 점찍으면 그 다음내용(?)-이걸 ...
    • 하얀까마귀
      2002.01.18 03:27
      안녕하세요 하얀까마귀 입니다. 그냥 단순히 폼안에서 실행한다면 ole까지도 필요없을것같은데.. 그...
    • 하얀까마귀
      2002.01.18 03:19
      안녕하세요 하얀까마귀 입니다. Mouse.CursorPos 을 이용하시면 됩니다. Mouse.CursorPos 은 현재 마...
    • 오상준
    • 2002.01.18 02:53
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2002.01.18 03:16
      안녕하세요 하얀까마귀 입니다. 방식이야 여러가지가 있겠죠. 그룹을 이용해서 하시는것 같은데 그룹...
    • 오상준
      2002.01.18 03:34
      다시 질문 드리는데요.. 의문사항이 있어서.. 제가 출력하고자 하는 목적이 종이 절약을 위해서 A4 ...
    • 염상철
      2002.04.05 01:40
      타이틀을 디테일 밴등에 넣으세여..
    • 김치연
    • 2002.01.18 02:48
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 델파이탐크루즈
      2002.01.18 04:36
    • 돌멩이
      2002.01.18 03:10
      =======   FHeadFont.Assign(self.Font);   FETCFont.Assign(self.Font); 이 부분...
    • 버섯
      2002.01.18 03:09
      이벤트 종류가 많겠지요.. 윈도 메세지를 받았을때 show 된다던가.. 아님 통신 포트따위에서 데이터가 ...
    • 김훈배
    • 2002.01.18 02:31
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 버섯
      2002.01.18 03:06
            TXY = record 인데 타이핑을 잘못하신거죠?    &n...
    • 김훈배
      2002.01.18 20:40
      님의 답변에 감사 드립니다. 지적해 주신 코딩의 에러는 옮기면서 잘못된 것이 맞습니다. 그리고 말씀 ...
    • 채승호
      2002.01.18 02:32
      //제가 전에 했던 코딩을  올려드립니다..  허접하지만... procedure TFORM1.bt...
    • 이희정
      2002.01.18 02:01
      DataPump 이용해보세요~
    • 조용한
    • 2002.01.18 01:41
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2002.01.18 07:46
      제가 데이타베이스 한지가 5년이 넘었네요. 그때는 꽤 잘한다고 했는데T_T 질문은 다름이 아니라 자...
    • 이중철
      2002.01.18 09:11
      Select B.date, 자동순번 - D.min_num from     (     Selec...
    • 하얀까마귀
      2002.01.18 02:04
      안녕하세요 하얀까마귀 입니다. 멋진 답변은 못해드릴것 같은데... 순번은 없을껄요?? 아마두..... ...
    • 조용한
      2002.01.18 02:16
      안녕하세요? 하얀 까마귀님... 혹시 기억하실련지...  '파란창공' 이라구.. 잘 지내시져??? ...
    • 하얀까마귀
      2002.01.18 03:01
      안녕하세요. 하얀까마귀 입니다.. 데이타 건수가 많고 단지 보기 위해 순번을 정하는 거라면 커리를 ...
    • 신현숙
    • 2002.01.18 01:17
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 버섯
      2002.01.18 03:24
      메일로 공문을 발송한다는것은 HTML파일을 텍스트 파일로 보시고 첨부해서 보내시면 되는겁니다. 따...
    • jshope
    • 2002.01.18 01:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 버섯
      2002.01.18 01:07
      자료실에 있는 인디를 설치하시구요... Ping 이란컴퍼넌트가 있는데 그걸로 체크하시면 됩니다. 자세한건...
    • 또똘
    • 2002.01.18 00:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 버섯
      2002.01.18 00:20
      0 : 반드시 채워야 됨 9 : 공백이 있어도 됨 999999-9999999;0 으로해보시죠... ^^
    • irookie
      2002.01.18 00:32
    • 송두진
    • 2002.01.18 00:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이창환
      2002.06.08 22:39
      메소드는 타입라이브러리 에디터에서 생성하여야만 합니다. 먼저 서버측에서 다음과 같이 메소드를 생성...
    • 버섯
      2002.01.18 01:10
      View --> Type Library 를 통해서 프로시져를 만든거 맞나여? 입출력 변수를 확실히 서술해주...
    • 버섯
      2002.01.17 23:54
      E: 에다가 또 다른 데이터 파일을 만드시면 됩니다. 데이터베이스 등록정보를 보시면 여러개의 데이터...
    • 최선용
      2002.01.18 00:26
      초보의 질문에 답변을 바로 주셔서 감사합니다....... 다시 한번 감사 합니다... 새해 복 만이 받으세요....