Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странные строки... 
:(
    Опции темы
kometa_triatlon
Дата 20.9.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Мне нужно считать текст из RichEdit'a в массив строк - построчно.
Нашел такой более-менее способ из мсдн.
Но результат...
Код

void CMyDlg::OnToolsRun()
{
    CString tmp;
    int i, nLineLength, nLineCount = m_editCode.GetLineCount();
    char **strCode = new char*[nLineCount];
    for(int j=0; j<nLineCount; ++j)
        strCode[j] = new char[100];

     for (i=0; i< nLineCount; ++i)
     {
        nLineLength = m_editCode.LineLength(i);
        m_editCode.GetLine(i, strCode[i],nLineLength);
        m_editOutput.GetWindowText(tmp);
        tmp+=strCode[i];
        m_editOutput.SetWindowText(tmp);
    
    }

    for(int j=0; j<nLineCount; ++j)
        delete [] strCode[j];
    delete [] strCode;
    
}

Вот, что у меня в едите:

Код

program Electronic_journal;

uses Objects, Drivers, Menus, Views, App, stddlg,Dialogs,
Memory,Dos,MsgBox,EJIntr,EJDlg,EJData;

type
  EJApp = object(TApplication)
    constructor Init;
    procedure HandleEvent(var Event: TEvent);Virtual;
    procedure InitMenuBar; virtual;
    procedure InitStatusLine; virtual;
    procedure InitDesktop; virtual;
    procedure NewDBase;
    procedure FileOpen;
    procedure Save(As:boolean;Descriptor:byte);
    procedure View(Title:String);
    procedure ChangeDir;
    destructor done;virtual;
  end;


var

  StudentCollection:PStudentCollection;
{********************************************************************}
{*****************************Init***********************************}

constructor EJApp.Init;
  begin
    DisableCommands(WinCom1);
    FileWork:=New(PFileWork, Init);
    OpenCount:=0;
    inherited Init;
  end;

{****************************End Init********************************}
{*****************************Done***********************************}

destructor EJApp.Done;
  begin
    Dispose(FileWork);
    inherited Done;
  end;

{****************************End Done********************************}
{***************************InitMenuBar******************************}

procedure EJApp.InitMenuBar;
var
  R: TRect;
begin
  GetExtent(R);
  R.B.Y := R.A.Y + 1;
  MenuBar := New(PMenuBar, Init(R, NewMenu(
    NewSubMenu('~F~ile', hcFile, NewMenu(
      NewItem('~N~ew', '', kbNoKey, cmNew, hcNew,
      NewItem('~O~pen...', 'F3', kbF3, cmFileOpen, hcFileOpen,
      NewItem('~S~ave', 'F2', kbF2, cmSave, hcSave,
      NewItem('Save ~a~s...','', kbNoKey, cmSaveAs, hcSaveAs,
      NewLine(
      NewItem('~C~hange dir', '', 0, cmChangeDir, hcChangeDir,
      NewItem('E~x~it', 'Alt+X', kbAltX, cmQuit, hcExit,
      nil)))))))),
    NewSubMenu('~J~ournal', hcJournal, Newmenu(
      NewItem('~V~iew', 'Alt+F1', kbaltF2, cmViewData, hcViewData,
      NewLine(
      NewItem('~S~earch', '', kbAltF, cmSearch, hcSearch,
      NewLine(
      NewItem('~I~nsert', '', kbNoKey, cmInsert, hcInsert,
      NewItem('~E~dit', '', kbNoKey, cmEdit, hcEdit,
      NewItem('~D~elete', '', kbNoKey, cmDelete, hcDelete
      ,nil)))))))),
    NewSubMenu('~O~ptions', hcOptions, NewMenu(
      NewItem('~V~ideo Mode','Alt+F9',kbAltF9,cmVideoMode,hcNoContext
      ,nil)),
      nil))))));
end;

{-----------------------------------------------------}
procedure EJApp.InitStatusLine;
var
  R: TRect;
begin
  GetExtent(R);
  R.A.Y := R.B.Y - 1;
  StatusLine := New(PHintStatusLine, Init(R,
    NewStatusDef($0, 999, StdStatusKeys(
       NewStatusKey('~Alt+X~ Exit',kbAltF3,cmQuit,
       NewStatusKey('~F3~ Open',kbf3,cmFileOpen,
       nil))),
    NewStatusDef($E000, $Ffff,  StdStatusKeys(
       NewStatusKey('~Alt+F3~ Close',kbAltF3,cmClose,
       NewStatusKey('~F3~ Open',kbf3,cmFileOpen,
       NewStatusKey('~Insert~ new record',kbIns,cmInsert,
       NewStatusKey('~Enter~ Edit',kbEnter,cmEdit,
       NewStatusKey('~Delete~',kbDel,cmDelete,
       NewStatusKey('~Alt+S~ Search',kbAltS,cmSearch,
       nil)))))))
    ,nil))));
end;

{-----------------------------------------------------}
procedure EJApp.InitDesktop;
var
  R: TRect;
begin
  GetExtent(R);
  R.b.y:=r.b.y-1;
  Desktop := New(PMyDesktop, Init(R));
end;

procedure EJApp.HandleEvent(var Event: TEvent);
  begin

    if Event.What = evCommand then
      case Event.Command of
        cmNew:
          begin
            NewDBase;
            ClearEvent(Event);
          end;
        cmFileOpen:
          begin
            FileOpen;
            ClearEvent(Event);
          end;
        cmSave:
          begin
            Save(false,EJDescriptor);
            ClearEvent(Event);
          end;
        cmSaveAs:
          begin
            Save(true,EJDescriptor);
            ClearEvent(Event);
          end;
        cmChangeDir:
          begin
            ChangeDir;
            ClearEvent(Event);
          end;
        cmVideoMode:
          begin
            SetScreenMode(ScreenMode xor smFont8x8);
            ClearEvent(Event);
          end;
{        cmSave:
          begin
            Save;
            ClearEvent(Event);
          end;}
      end;
    Inherited HandleEvent(Event);
  end;


procedure EJApp.NewDBase;
  var
    Data:TNewDBaseDialogData;
    ND:PNewDBaseDialog;
    FirstLabWork,
    LastLabWork,
    norm:byte;
    code:integer;
    R:TRect;
    PW:PMyWindow;
  begin
    with data do
      begin
        FacultyData:='”?‚’';
        GroupData:='?‘-';
        FirstLabWorkData:='  ';
        LastLabWorkData:='  ';
        NormData:='  ';
      end;
    ND:=New(PNewDBaseDialog,Init);
    ND^.SetData(Data);
    if ExecView(ND)<>cmCancel then
      begin
        ND^.GetData(Data);
        Val(Data.FirstLabWorkData,FirstLabWork,code);
        Val(Data.LastLabWorkData,LastLabWork,code);
        Val(Data.NormData,Norm,code);
        if (LastLabWork<FirstLabWork) or
           (LastLabWork-FirstLabWork+1<norm) or
           (LastLabWork-FirstLabWork>11) then
           begin
             MessageBox(#3+'‚ўҐ¤Ґ­л ­Ґ Їа ўҐ«м­лҐ ¤ ­­лҐ.'+#13+#3+
                        '?®¦ «г©бв  Ї®ўв®аЁвҐ ўў®¤ ¤ ­­ле.',nil,mfError or mfOkButton);
             exit;
           end;
        FileWork^.NewFile;
        if FileWork^.Current^<>0 then
          begin
           StudentCollection:=New(PStudentCollection,Init(30,5,
                               FileWork^.Current^,
                               Data.GroupData,Data.FacultyData,
                               FirstLabWork,LastLabWork,norm));
           OpenCount:=OpenCount+1;
           EnableCommands(WinCom1);
           if OpenCount=5 then DisableCommands(WinCom2);
           View(Data.FacultyData+' '+Data.GroupData);
          end;
      end;
  end;

procedure EJApp.FileOpen;
var
  R: TRect;
  FileDialog: PFileDialog;
  TheFile: FNameStr;
  Result:TResult;
const
  FDOptions: Word = fdOKButton or fdOpenButton;
begin
  TheFile := '*.edb';
  New(FileDialog, Init(TheFile, 'Open file', 'File ~n~ame',
    FDOptions, 1));
  FileDialog^.helpCTX:=hcFileOpen;
  if executeDialog(FileDialog,@thefile) <> cmCancel then
    begin
      FileWork^.OpenFile(TheFile,Result);
      If Result=2 then exit;
      if Result=0 then
        begin
          StudentCollection:=New(PStudentCollection,Init(30,5,
                              FileWork^.Current^,'','',1,1,3));
          StudentCollection^.ReadFile(FileWork^.Files[FileWork^.Current^]);
          if StudentCollection^.Descriptor^<>0 then
            begin
              OpenCount:=OpenCount+1;
              EnableCommands(WinCom1);
              if OpenCount=5 then DisableCommands(WinCom2);
              View(StudentCollection^.Attributes.Faculty^+' '+
                   StudentCollection^.Attributes.Group^)
            end
          else
             FileWork^.CloseFile(FileWork^.Current^);
        end;
      if Result=1 then NewDBase;
    end;
end;


procedure EJApp.Save(As:boolean;Descriptor:byte);
  var
    FileDialog: PFileDialog;
    TheFile: FNameStr;
    result:TResult;

  begin
    if As then
      begin
        TheFile:= '*.edb';
        New(FileDialog, Init(TheFile, 'Save file as', '~S~ave file as',fdOKButton, 1));
          {   FileDialog^.HelpCtx:=hcFastSave;}
        if ExecuteDialog(FileDialog,@TheFile) <> cmCancel then
        FileWork^.SaveFile(As,EJDescriptor,TheFile,Result);
      end
    else
      FileWork^.SaveFile(As,EJDescriptor,'',Result);
      EJSave:=True;
  end;


procedure EJApp.ChangeDir;
  begin
     execview(new(pChDirDialog,init(0,0)));
  end;


procedure EJApp.View(Title:String);
var
  R:TRect;
  PW:PMyWindow;
begin
  GetExtent(R);
  R.A.Y:=R.A.Y+1;
  R.B.Y:=(R.B.Y)-1;
  PW:=New(PMyWindow, Init(R,Title,FileWork^.Current^,StudentCollection));
{  Dispose(StudentCollection,done);}
  Desktop^.Insert(PW);
end;



var
  EJ:EJApp;
begin
  EJ.Init;
  EJ.Run;
  EJ.Done;
end.ээээ««««««««ою

А вот, что я получаю, когда вывожу массив:
Код

program Electronic_journal;НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««
uses Objects, Drivers, MenuНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««Memory,Dos,MsgBox,EJIntr,EJНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««
type
  EJApp = object(TApplicatiНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    constructor Init;
    procedure HandleEvent(vНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    procedure InitMenuBar; НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    procedure InitStatusLinНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    procedure InitDesktop; НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    procedure NewDBase;
    procedure FileOpen;
    procedure Save(As:booleНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    procedure View(Title:StНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    procedure ChangeDir;
    destructor done;virtualНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««  end;


var

  StudentCollection:PStudenНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««{**************************НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««{**************************НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««
constructor EJApp.Init;
    DisableCommands(WinCom1);
    FileWork:=New(PFileWork, Init);
    OpenCount:=0;
    inherited Init;
  end;

{****************************End Init********************НННННННННННННННННННННННННННННННННННННННННННээээ««««««««{*****************************Done***********************НННННННННННННННННННННННННННННННННННННННННННээээ««««««««
destructor EJApp.Done;
  begin
    Dispose(FileWork);
    inherited Done;
  end;

{****************************End Done********************НННННННННННННННННННННННННННННННННННННННННННээээ««««««««{***************************InitMenuBar******************НННННННННННННННННННННННННННННННННННННННННННээээ««««««««
procedure EJApp.InitMenuBar;
var
  R: TRect;
begin
  GetExtent(R);
  R.B.Y := R.A.Y + 1;
  MenuBar := New(PMenuBar, Init(R, NewMenu(
    NewSubMenu('~F~ile', hcFile, NewMenu(
      NewItem('~N~ew', '', kbNoKey, cmNew, hcNew,
      NewItem('~O~pen...', 'F3', kbF3, cmFileOpen, hcFileНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      NewItem('~S~ave', 'F2', kbF2, cmSave, hcSave,
      NewItem('Save ~a~s...','', kbNoKey, cmSaveAs, hcSavНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      NewLine(
      NewItem('~C~hange dir', '', 0, cmChangeDir, hcChangНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      NewItem('E~x~it', 'Alt+X', kbAltX, cmQuit, hcExit,
НННННННННННННННННННННННННННННННННННННННННННээээ««««««««      nil)))))))),
    NewSubMenu('~J~ournal', hcJournal, Newmenu(
      NewItem('~V~iew', 'Alt+F1', kbaltF2, cmViewData, hcНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      NewLine(
      NewItem('~S~earch', '', kbAltF, cmSearch, hcSearch,НННННННННННННННННННННННННННННННННННННННННННээээ««««««««      NewLine(
      NewItem('~I~nsert', '', kbNoKey, cmInsert, hcInsertНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      NewItem('~E~dit', '', kbNoKey, cmEdit, hcEdit,
      NewItem('~D~elete', '', kbNoKey, cmDelete, hcDeleteНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      ,nil)))))))),
    NewSubMenu('~O~ptions', hcOptions, NewMenu(
      NewItem('~V~ideo Mode','Alt+F9',kbAltF9,cmVideoModeНННННННННННННННННННННННННННННННННННННННННННээээ««««««««      ,nil)),
      nil))))));
end;

{-----------------------------------------------------}
procedure EJApp.InitStatusLine;
var
  R: TRect;
begin
  GetExtent(R);
  R.A.Y := R.B.Y - 1;
  StatusLine := New(PHintStatusLine, Init(R,
    NewStatusDef($0, 999, StdStatusKeys(
       NewStatusKey('~Alt+X~ Exit',kbAННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~F3~ Open',kbf3,cННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       nil))),
    NewStatusDef($E000, $Ffff,  StdStaННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~Alt+F3~ Close',kННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~F3~ Open',kbf3,cННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~Insert~ new recoННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~Enter~ Edit',kbEННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~Delete~',kbDel,cННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       NewStatusKey('~Alt+S~ Search',kННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««       nil)))))))
    ,nil))));
end;

{-------------------------------------ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««procedure EJApp.InitDesktop;
var
  R: TRect;
begin
  GetExtent(R);
  R.b.y:=r.b.y-1;
  Desktop := New(PMyDesktop, Init(R));ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««end;

procedure EJApp.HandleEvent(var Event:ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««  begin

    if Event.What = evCommand then
      case Event.Command of
        cmNew:
          begin
            NewDBase;
            ClearEvent(Event);
          end;
        cmFileOpen:
          begin
            FileOpen;
            ClearEvent(Event);
          end;
    ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          begin
            Save(true,EJDescriННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««            ClearEvent(Event);ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          end;
        cmChangeDir:
          begin
            ChangeDir;
            ClearEvent(Event);ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          end;
        cmVideoMode:
          begin
            SetScreenMode(ScreННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««            ClearEvent(Event);ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          end;
{        cmSave:
          begin
            Save;
            ClearEvent(Event);ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          end;}
      end;
    Inherited HandleEvent(EvenННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««  end;


procedure EJApp.NewDBase;
  var
    Data:TNewDBaseDialogData;
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    ND:PNewDBaseDialog;
    FirstLabWork,
    LastLabWork,
    norm:byte;
    code:integer;
    R:TRect;
    PW:PMyWindow;
  begin
    with data do
      begin
        FacultyData:=НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        GroupData:='¬НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        FirstLabWorkDНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        LastLabWorkDaНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        NormData:='  НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««      end;
    ND:=New(PNewDBaseНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    ND^.SetData(Data)НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    if ExecView(ND)<>НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««      begin
        ND^.GetData(DНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        Val(Data.FirsНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        Val(Data.LastНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        Val(Data.NormНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        if (LastLabWoНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««           (LastLabWoНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««           (LastLabWork-FirstLabWork>11) then
           begin
             MessageBox(#3+'^?¤?­; ­? 0 ^?«<­;? ¤ ­НННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««                        '®¦ «3©12  ®^2®02? ^^®¤ ¤ НННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««             exit;
           end;
        FileWork^.NewFile;
        if FileWork^.Current^<>0 then
          begin
           StudentCollection:=New(PStudentCollection,НННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««                               FileWork^.Current^,
                               Data.GroupData,Data.FaНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««                               FirstLabWork,LastLabWoНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««           OpenCount:=OpenCount+1;
           EnableCommands(WinCom1);
           if OpenCount=5 then DisableCommands(WinComНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««           View(Data.FacultyData+' '+Data.GroupData);НННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          end;
      end;
  end;

procedure EJApp.FileOpen;
var
  R: TRect;
  FileDialog: PFileDialog;
  TheFile: FNameStr;
  Result:TResult;
const
  FDOptions: Word = fdOKButton or fdOpenButton;
begin
  TheFile := '*.edb';
  New(FileDialog, Init(TheFile, 'Open file', 'File ~nНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    FDOptions, 1));
  FileDialog^.helpCTX:=hcFileOpen;
  if executeDialog(FileDialog,@thefile) <> cmCancel tНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««    begin
      FileWork^.OpenFile(TheFile,Result);
      If Result=2 then exit;
      if Result=0 then
        begin
          StudentCollection:=New(PStudentCollection,IНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««                              FileWork^.Current^,'','НННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          StudentCollection^.ReadFile(FileWork^.FilesНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          if StudentCollection^.Descriptor^<>0 then
            begin
              OpenCount:=OpenCount+1;
              EnableCommands(WinCom1);
              if OpenCount=5 then DisableCommands(WinНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««              View(StudentCollection^.Attributes.FacuНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««                   StudentCollection^.Attributes.GrouНННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««            end
          else
             FileWork^.CloseFile(FileWork^.Current^);НННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        end;
      if Result=1 then NewDBase;
    end;
end;


procedure EJApp.Save(As:boolean;DesНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««  var
    FileDialog: PFileDialog;
    TheFile: FNameStr;
    result:TResult;

  begin
    if As then
      begin
        TheFile:= '*.edb';
        New(FileDialog, Init(TheFilНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««          {   FileDialog^.HelpCtx:=НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        if ExecuteDialog(FileDialogНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««        FileWork^.SaveFile(As,EJDesНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««      end
    else
      FileWork^.SaveFile(As,EJDescrНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««      EJSave:=True;
  end;


procedure EJApp.ChangeDir;
  begin
     execview(new(pChDirDialog,initНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««  end;


procedure EJApp.View(Title:String);НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««var
  R:TRect;
  PW:PMyWindow;
begin
  GetExtent(R);
  R.A.Y:=R.A.Y+1;
  R.B.Y:=(R.B.Y)-1;
  PW:=New(PMyWindow, Init(R,Title,FileННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««{  Dispose(StudentCollection,done);}
  Desktop^.Insert(PW);
end;



var
  EJ:EJApp;
begin
  EJ.Init;
  EJ.Run;
  EJ.Done;
end.????««««««««??


Кроме того, кириллица превращается в ???. Ну да то ладно, не важно...

А чего ж так получается? Или есть способ получше считать текст в массив?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Dreamer_0x01
Дата 20.9.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



1.А в сам эдит ты строки чем заносишь? Случаем не из массива тоже копируешь?
2. И в чем ты просматриваешь массив?

Я к чему...К тому, что если строка представлена видом char[n_bytes], то в таких строках надо принудительно ставить конец строки, например, нулевой символ. Тогда и отладчик, и всякие функции типа sprintf и симейство будут видеть эти строки нормально. А когда конец строки не виден, то как раз лезет мусор из памяти. А "дырки" в памяти за границами диапазона массивовкак правило заполняются этой гадостью вида "MMMMM...."
Короче, проверь, не нуждается ли твой код в символах окончания строки....




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
kometa_triatlon
Дата 20.9.2005, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Знаешь, такие мысли были...
Как заношу в едит?
Код

ULONGLONG length = file.GetLength();
            char* buf = new char[length]; 
            file.Read(buf, length);
            m_editCode.SetWindowText(buf);
            delete [] buf;

Добавлено @ 20:31
А как принудительно добавить '\0'? smile
strcat(strCode[i],'\0'); вылетает с ексепшном, strCode[i][strlen(strCode[i])] = '\0'; результата не дало


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Dreamer_0x01
Дата 20.9.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



а если так: ?
Код

strCode[i][strlen(strCode[i])-1] =0;


и здесь

Код

file.Read(buf, length);
buf[lenth-1]=0;


Попробуй!!!

Это сообщение отредактировал(а) Dreamer_0x01 - 20.9.2005, 20:54


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
kometa_triatlon
Дата 20.9.2005, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



неа...
smile


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
sergejzr
Дата 20.9.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Кoнечно вылетает Эти функции ведь ищут тот же символ '\0'для распознания конца
слова. А тебе надо искать '\n'.
Добавлено @ 21:10
Чтото вроде этого
Код

int indexOf(const char*str)
{
int i;
for(i=0;str[i]!='\n' && str[i]!=EOF;i++); //EOF проверяем, если после последней строки нет перехода.
return i;
}

main()
{
char * strCode;
//берёшь свой strCode
//....
//....

Заменяешь переход строки на конец слова
strCode[indexOf(strCode)]=0;

//Вуаля, работаешь дальше
}


или вот функция для того же самого

Код

void Replace_n_With_0(char * str)
{
for(;*str!='\n' && str!=EOF;str++);
*str=0;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
kometa_triatlon
Дата 20.9.2005, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Частично решил так:
Код

void CMyDlg::OnToolsRun()
{
    CString tmp;
    int i, nLineLength, nLineCount = m_editCode.GetLineCount();
    char **strCode = new char*[nLineCount];
     for (i=0; i< nLineCount; i++)
     {
        nLineLength = m_editCode.LineLength(i);
        strCode[i] = new char[nLineLength+1];
        m_editCode.GetLine(i, strCode[i],nLineLength);
        strCode[i][nLineLength]=0;
        m_editOutput.GetWindowText(tmp);
        tmp+=strCode[i];
        m_editOutput.SetWindowText(tmp);
    
    }

    for(int j=0; j<nLineCount; ++j)
        delete [] strCode[j];
    delete [] strCode;
    
}

Точнее почти полностью. Почти потому что иногда теряется символ '\n' в конце строки.
Другая проблема серьезнее. Если файл довольно большой, вылетаю с абортом smile
Хотя какой там большой... 300 строк уже не катит...
Добавлено @ 21:17
sergej.z
smile
А зачем мне заменять символ перехода на конец? Тогда в другом окне я получу одну длинную строку.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
sergejzr
Дата 20.9.2005, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(kometa_triatlon @ 20.9.2005, 20:12)
Почти потому что иногда теряется символ '\n' в конце строки.

Это в последней строке файла. Из за того и abort что там он ищет переход, а его нет. и так до конца памяти smile
Добавлено @ 21:21
Цитата(kometa_triatlon @ 20.9.2005, 20:12)
А зачем мне заменять символ перехода на конец? Тогда в другом окне я получу одну длинную строку.

Posle сложения строк заменишь 0 обратно на переход. Это же элементарно.




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
kometa_triatlon
Дата 20.9.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



sergej.z
А вот и не в последней строке smile В первой и еще какой-то. Но я думаю, то глюк файла, потому что не всегда такое.
А насчет аборта... Там с памятью проблемы.
Что пишет: File: dbgheap.c
Expression: _CrtCheckMemory()

Ну это опять же с более-менее большими файлами. Может, массив не помещается?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
The Thing
Дата 20.9.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: 1
Всего: 3



Посмотри дебугером.... строка копируется в массив нормально?
Именно после первого прогона... так как скорее всего ты действительно попал на \0, а надо на \r\n
Код

m_editCode.GetLine(i, strCode[i],nLineLength);



--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Dreamer_0x01
Дата 20.9.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



strCode[i][nLineLength]=0;

А здесь ты не вылез за границу массива?
не nLineLenth-1 надо делать разве???


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
kometa_triatlon
Дата 21.9.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Dreamer_0x01
Не вылез, я памяти на байт больше выделяю smile
Код

  strCode[i] = new char[nLineLength+1];


Гм. На самом деле, глюк спрятался здесь:

Код

  for(int j=0; j<nLineCount; ++j)    
        delete [] strCode[j];    
    delete [] strCode;

Протрассировал, строки копируются нормально, а когда освобожаю память, вылетаю...


The Thing
А строки копируются просто удивительно. Как хотят smile Вообще беспредел, сравните:
На входе:
Код

// lab1Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "lab1.h"
#include "lab1Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif



// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CMyDlg dialog



CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDlg::IDD, pParent)
    , m_strFileName(_T(""))
    , m_bFileOpened(false)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_RICHEDIT_CODE, m_editCode);
    DDX_Control(pDX, IDC_RICHEDIT_OUTPUT, m_editOutput);
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
    ON_WM_SIZE()
    ON_COMMAND(ID_TOOLS_RUN, OnToolsRun)
    ON_COMMAND(ID_FILE_SAVE, OnFileSave)
END_MESSAGE_MAP()


// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    CFont* pFont = new CFont();

    VERIFY(pFont->CreateFont(
    16,                        // nHeight
    0,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    "Courier New"));                 // lpszFacename


    m_editCode.SetFont(pFont);
    m_editOutput.SetFont(pFont);
    
    delete pFont;

    m_pMenu = new CMenu();
    m_pMenu->LoadMenu(IDR_MAINFRAME);
    SetMenu(m_pMenu);
    
    /*m_pToolBar = new CToolBarCtrl();

    m_pToolBar->CreateEx( TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
        WS_CHILD | WS_VISIBLE | CBRS_TOP, 
        CRect(0, 0, 0, 0),
        this,
        AFX_IDW_CONTROLBAR_FIRST);

    m_pToolBar->AddBitmap(3, IDB_TOOLBAR);

    TBBUTTON Buttons[5];

    Buttons[0].iBitmap = -1;
    Buttons[0].fsState = TBSTATE_ENABLED;
    Buttons[0].fsStyle = TBSTYLE_SEP;

    Buttons[1].iBitmap = 0;
    Buttons[1].fsState = TBSTATE_ENABLED;
    Buttons[1].fsStyle = TBSTYLE_BUTTON;
    Buttons[1].idCommand = ID_FILE_OPEN;

    Buttons[2].iBitmap = 1;
    Buttons[2].fsState = TBSTATE_ENABLED;
    Buttons[2].fsStyle = TBSTYLE_BUTTON;
    Buttons[2].idCommand = ID_FILE_SAVE;

    Buttons[3].iBitmap = -1;
    Buttons[3].fsState = TBSTATE_ENABLED;
    Buttons[3].fsStyle = TBSTYLE_SEP;

    Buttons[4].iBitmap = 2;
    Buttons[4].fsState = TBSTATE_ENABLED;
    Buttons[4].fsStyle = TBSTYLE_BUTTON;
    Buttons[4].idCommand = ID_TOOLS_RUN;

    m_pToolBar->AddButtons(5, Buttons);*/

    if (!m_wndToolBar.CreateEx(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))    
        return -1;    
     
    m_wndToolBar.SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);    
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMyDlg::OnPaint() 
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

BOOL CMyDlg::DestroyWindow()
{
    // TODO: Add your specialized code here and/or call the base class
    delete m_pMenu;
    ////delete m_pToolBar;
    return CDialog::DestroyWindow();
}

void CMyDlg::OnFileOpen()
{
    char szFilter[] = "Pascal Source Files (*.pas) |*.pas|Text Files (*.txt)|*.txt|All Files (*.*)|*.*||";
    CFileDialog dlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT, szFilter);
    if( dlg.DoModal() == IDOK) {
         m_strFileName = dlg.m_ofn.lpstrFile;

        CFile file;
        CFileException e;
        
        if( !file.Open( m_strFileName, CFile::modeRead ) )
        {
        #ifdef _DEBUG
            afxDump << "File could not be opened " << e.m_cause << "\n";
        #endif
        }
        else
        {
            ULONGLONG length = file.GetLength();
            char* buf = new char[length+1]; 
            file.Read(buf, length);
            buf[length]=0;
            m_editCode.SetWindowText(buf);
    
            delete [] buf;

            m_bFileOpened = true;
        }
        file.Close();
    }
}

void CMyDlg::OnToolsRun()
{
    CString tmp;
    int i, nLineLength, nLineCount = m_editCode.GetLineCount();
    //char strCode[1000][256];
    char **strCode = new char*[nLineCount];
    //CString strCode[1000];
    /*for(int j=0; j<nLineCount; ++j)
        strCode[j] = new char[256];*/

     for (i=0; i< nLineCount; i++)
     {
        nLineLength = m_editCode.LineLength(i);
        strCode[i] = new char[nLineLength+1];

        m_editCode.GetLine(i, strCode[i],nLineLength);
        strCode[i][nLineLength]=0;
        //strCode[i][strlen(strCode[i])] = 0;
        //TRACE(strCode[i]);
        m_editOutput.GetWindowText(tmp);
        tmp+=strCode[i];
        m_editOutput.SetWindowText(tmp);
    
    }

    /*for(int j=0; j<nLineCount; ++j)
        delete strCode[j];
    delete  strCode;*/
    
}

void CMyDlg::OnFileSave()
{
    if( m_bFileOpened ){
        CFile file;
        CFileException e;
            
            if( !file.Open( m_strFileName, CFile::modeWrite ) )
            {
            #ifdef _DEBUG
                afxDump << "File could not be opened " << e.m_cause << "\n";
            #endif
            }
            else
            {
                CString strCode;
                m_editCode.GetWindowText(strCode);
                file.Write(strCode, strlen(strCode.GetBuffer()));
                file.Close();
            }
    }
}


На выходе:
Код

// lab1Dlg.cpp : implementation file//

#include "stdafx.h"
#include "lab1.h"
#include "lab1Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif



// CAboutDlg dialog used for App Abo
class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataEx
// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAb{
}

void CAboutDlg::DoDataExchange(CData{
    C}

END_MESSAGE_MAP()


// CMyDlg dialog



CMyDlg::CMyDlg(CWnd    : CDialog(CMyDlg::    , m_strFileName(_T    , m_bFileOpened(fa{
    m_hIcon = AfxGetAp}

void CMyDlg::DoData{
    CDialog::DoDataExc    DDX_Control(pDX, I    DDX_Control(pDX, I}

BEGIN_MESSAGE_MAP    ON_WM_SYSCOMMAND    ON_WM_PAINT()
    ON_WM_QUERYDRAGI    //}}AFX_MSG_MAP
    ON_COMMAND(ID_FI    ON_WM_SIZE()
    ON_COMMAND(ID_TO    ON_COMMAND(ID_FIEND_MESSAGE_MAP()

// CMyDlg message
BOOL CMyDlg::OnIn{
    CDialog::OnInitDial
    // Add "About..." m
    // IDM_ABOUTBOX mus    ASSERT((IDM_ABOUTBO    ASSERT(IDM_ABOUTBOX
    CMenu* pSysMenu = G    if (pSysMenu != NUL    {
        CString strAboutMe        strAboutMenu.LoadS        if (!strAboutMenu.        {
            pSysMenu->AppendM            pSysMenu->AppendM        }
    }

    // Set the icon for    SetIcon(m_hI    SetIcon(m_hI
    // TODO: Add    CFont* pFont
    VERIFY(pFont    16,          0,           0,           0,           FW_NORMAL,    FALSE,       FALSE,       0,                   ANSI_CHARSET,        OUT_DEFAULT_PRECIS,    CLIP_DEFAULT_PRECIS,    DEFAULT_QUALITY,     DEFAULT_PITCH | FF_S    "Courier New"));    

    m_editCode.SetFont(p    m_editOutput.SetFont    
    delete pFont;

    m_pMenu = new CMenu(    m_pMenu->LoadMenu(ID    SetMenu(m_pMenu);
    
    /*m_pToolBar = new C
    m_pToolBar->CreateEx        WS_CHILD | WS         this      
    m_pTo
    TBBUT    Buttons[0].fsStyle = TBSTYLE_SEP;

    Buttons[1].iBitmap = 0;
    Buttons[1].fsState = TBSTATE_ENABLED;    Buttons[1].fsStyle = TBSTYLE_BUTTON;
    Buttons[1].idCommand = ID_FILE_OPEN;

    Buttons[2].iBitmap = 1;
    Buttons[2].fsState = TBSTATE_ENABLED;    Buttons[2].fsStyle = TBSTYLE_BUTTON;
    Buttons[2].idCommand = ID_FILE_SAVE;

    Buttons[3].iBitmap = -1;
    Buttons[3].fsState = TBSTATE_ENABLED;    Buttons[3].fsStyle = TBSTYLE_SEP;

    Buttons[4].iBitmap = 2;
    Buttons[4].fsState = TBSTATE_ENABLED;    Buttons[4].fsStyle = TBSTYLE_BUTTON;
    Buttons[4].idCommand = ID_TOOLS_RUN;

    m_pToolBar->AddButtons(5, Buttons);*/
    if (!m_wndToolBar.CreateEx(this) || !        return -1;    
     
    m_wndToolBar.SetBarStyle(CBRS_ALIG    RepositionBars(AFX_IDW_CONTROLBAR_
    return TRUE;  // return TRUE  unless }

void CMyDlg::OnSysCommand(UINT nID, LP{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    {
        CDialog::OnSysCommand(nID, lPa    }
}

// If you add a minimize button //  to draw the icon.  For MFC a//  this is automatically done f
void CMyDlg::OnPaint() 
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device c
        SendMessage(WM_ICONERASEBKGND,
        // Center icon in client recta        int cxIcon = GetSystemMetrics(        int cyIcon = GetSystemMetrics(        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon        int y = (rect.Height() - cyIco
        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}
//  theHCURSOR{
    return}

BOOL CM{
    // TODO: Add    delete m_pMe    ////delete m    return CDial}

void CMyDlg::{
    char szFilte    CFileDialog    if( dlg.DoMo         m_strFileN
        CFile file;        
        if( !file.Op        {
        #ifdef _DEBU            afxDump <<        #endif
        }
        else
        {
            ULONGLONG l            char* buf =            file.Read(b            buf[length]            m_editCode.    
            delete [] buf;

            m_bFileOpened = true;
        }
        file.Close();
    }
}

void CMyDlg::OnToolsRun()
{
    CString tmp;
    int i, nLineLength, nLineCou    //char strCode[1000][256];
    char **strCode = new char*[n    //CString strCode[1000];
    /*for(int j=0; j<nLineCount;        strCode[j] = new char[256];
     for (i=0; i< nLineCount; i+     {
        nLineLength = m_editCode.Li        strCode[i] = new char[nLine
        m_editCode.GetLine(i, strCo        strCode[i][nLineLength]=0;
        //strCode[i][strlen(strCode        //TRACE(strCode[i]);
        m_editOutput.GetWindowText(        tmp+=strCode[i];
        m_editOutput.SetWindowText(    }

    /*for(int        delete st    delete  st    
}

void CMyDlg{
    if( m_bFil        CFile fil        CFileException e;
            
            if( !file.Open( m_strFileName, CFile::modeWrite ) )
            {
            #ifdef _DEBUG
                afxDump << "File could not be opened " << e.m_cause << "\n";
            #endif
            }
            else
            {
                CString strCode;
                m_editCode.GetWindowText(strCode);
                file.Write(strCode, strlen(strCode.GetBuffer()));
                file.Close();
            }
    }
}





--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
kometa_triatlon
Дата 21.9.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Я тут еще кое-что заметил...
Как-то странно работает m_editCode.LineLength(i); - все время возвращает одно и тоже значение - длину первой строки. И если остальные длиннее - получается обрезание smile
Такой текст
Код

void CMyDlg::OnPaint() 
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

Превращается в такой:
Код

void CMyDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); /

        SendMessage(WM_ICONE

        // Center icon in cl
        int cxIcon = GetSyst
        int cyIcon = GetSyst
        CRect rect;
        GetClientRect(&rect)
        int x = (rect.Width(
        int y = (rect.Height

        // Draw the icon
        dc.DrawIcon(x, y, m_
    }
    else
    {
        CDialog::OnPaint();
    }
}



Интересные вещи происходят.
GetLine возвращает количество скопированных символов, nLineLength в данном случае ограничитель.
Код

tmp.Format("\n%d == %d", m_editCode.GetLine(i, strCode[i],nLineLength),nLineLength);
        TRACE(tmp);

23 == 23
2 == 23
17 == 23
3 == 23
23 == 23
1 == 23
23 == 23
1 == 23
23 == 23
23 == 23
23 == 23
14 == 23
23 == 23
23 == 23
23 == 23
1 == 23
19 == 23
23 == 23
3 == 23
6 == 23
3 == 23
22 == 23
3 == 23
2 == 23


И это при том, что я вызываю nLineLength = m_editCode.LineLength(i); в начале цикла.
Я как-то неправильно с этой функцией работаю? Почему каждый раз одни и те же значения???

Это сообщение отредактировал(а) kometa_triatlon - 21.9.2005, 21:44


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 22.9.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
Во -первых если уже взялся за МФС, то давай полностью МФС( взялся танцевать с дьяволом, танцу до конца)! smile Я имею ввиду CStdioFile
У меня сейчас РЕАЛЬНО мало времени, поэтому многие топики без ответов и не т времени код смотреть, но вот лови-может поможет.
Там с комментариями.. smile

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ExampleRE.rar 38,22 Kb


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 25.9.2005, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Coocky
Посмотрел пример, кой-чему научился smile

Ну, только что переписал функцию, вроде все работает, но есть небольшая (и не новая) проблема.
Вылетаю при попытке освободить память, выделенную под массив для текста кода.
Скажите, если я выделяю память под двумерный динмассив, как ее правильно освободить?
Достаточно delete [] arrSzCode; ?
Потому что вылетаю именно на :
for(int j=0; j<nLineCount; j++) delete [] arrSzCode[j];

Код

void CMyDlg::OnToolsRun()
{
    int nLineCount = m_editCode.GetLineCount();
    char **arrSzCode = new char*[nLineCount];
    CString strCodeFromEditCtrl;

    m_editCode.GetWindowText(strCodeFromEditCtrl);
     
    char *pToken;
    pToken = strtok(strCodeFromEditCtrl.GetBuffer(),"\r\n");

    int i=0;
    while (pToken != NULL){
        arrSzCode[i] = new char[256];
        strcpy(arrSzCode[i], pToken);
        strcat(arrSzCode[i],"\n");
        m_editOutput.SetSel(-1,-1);
        m_editOutput.ReplaceSel(arrSzCode[i], FALSE);
        pToken = strtok(NULL, "\r\n");
        i++;
    }
        
        
    //for(int j=0; j<nLineCount; j++)
    //    delete [] arrSzCode[j];
    delete [] arrSzCode;
}




--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 26.9.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
Второй раз говорю-пользуйся МФС методами--т.е. CString классом.
Что тебе конкретно надо (извини, но немного не понял, распиши плиз, что ты ХОЧЕШЬ сделать со строкой?)
Все сделаем через МФС smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 26.9.2005, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Coocky
Освободить от нее память.
CString... Да мне он и не нужен, все и так работает прекрасно, мне придется много переписывать.

Проблема одна: как освободить правильно память от массива char **arrSzCode ?

Цитата
Скажите, если я выделяю память под двумерный динмассив, как ее правильно освободить?
Достаточно delete [] arrSzCode; ?
Потому что вылетаю на :
for(int j=0; j<nLineCount; j++) delete [] arrSzCode[j];

Это конечно в раздел С++, но все же...



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 26.9.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
А я в третий раз smile говорю-будем делать без выделения памяти( вообще-что отладчик показывает на точке вылетания?), т.е. стрингом! smile
Что нуна? smile
Добавлено @ 15:43
И кажется, надо не delete [] arrSzCode[j]; delete arrSzCode[j];eckb d wbrkt
Уже и сам забыл... smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 26.9.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(kometa_triatlon @ 26.9.2005, 15:30)
Скажите, если я выделяю память под двумерный динмассив, как ее правильно освободить?
Достаточно delete [] arrSzCode; ?
Потому что вылетаю на :
for(int j=0; j<nLineCount; j++) delete [] arrSzCode[j];

Не достаточно, нужно в цикле, как ты и делаешь, но можно просто delete вместо delete[], в обоих случаях.

Вылетаешь ты, 100%, потому что где-то одна строка залазит на место другой и портит информацию, которую ожидает найти при освобождении отладочная версия delete. Точнее, смотри, на освобождении какой строки вылетел - предыдущая и испортила память. Это если они выделяются подряд, что не факт. Но если все блоки одинаковой длины, то так. Ищи блох, короче. Или последуй совету Coocky и перепиши все на строки - это, скорее всего, быстрее будет.


--------------------
...
PM   Вверх
kometa_triatlon
Дата 26.9.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Coocky
Ну дай ребенку поиграться с памятью! smile
Хотя наверное придется переписать...
Справлюсь и сам, но все равно буду делать динамически, все-таки я в массив файл считываю.

Earnest
Поковырялся немного, интересная ситуация...
Вылетаю на последней строке или где-то в районе. Открывает мне файл dllheap.c и тычет мордой в функцию CheckBytes(). Диагноз понятен ))
Попробовал уменьшить кол-во строк в цикле,
Код

for(int j=0; j<nLineCount-2; j++)

но если открыть файл побольше, то не канает, а с десятью строками и так справляется.
Такие пироги... Ну все, иду переписывать.

Это сообщение отредактировал(а) kometa_triatlon - 26.9.2005, 18:26


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
The Thing
Дата 27.9.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: 1
Всего: 3



Что не понятно спрашивай...
Код

void CMyDlg::OnToolsRun()
{
    int nLineCount = m_editCode.GetLineCount();
    
    char **arrSzCode = new char* [nLineCount];
    char *pText, *pCurrentText;

    long lLengthText = m_editCode.GetTextLength() + 1; //bag - returned on one small

    pText = new char [lLengthText + 1];
    pText[lLengthText] = NULL;
    
    m_editCode.GetWindowText(pText, lLengthText);

    pCurrentText = pText;

    int length;
    int iCount = 0;
    while(iCount < nLineCount && pText){ //count sting & test on end text
        
        //********************* strtok(...) ******************************
        //length current line
        length = 0;
        while(*(pCurrentText + length) != '\r' &&
            *(pCurrentText + length) != '\n' && //vryadli popadetsya
            *(pCurrentText + length) )
            length++;
        
        bool bEndNewStr = true; //flag - testing on end text for out '\r\n'
        if( !(*(pCurrentText + length)) )
            bEndNewStr = false; //end text

        arrSzCode[iCount] = new char [ bEndNewStr? (length + 1 + 2) :(length + 1) ];
        
        if(bEndNewStr){ //not end text
            arrSzCode[iCount][length] = 13; //takse mozno ne stavit esli skopirovat is buffera (pText)
            arrSzCode[iCount][length + 1] = 10;
        }
        
        arrSzCode[iCount][ bEndNewStr? (length + 2) :length ] = NULL;

        int i=0;
        for(; i < length; i++) // strcpy(...)
            arrSzCode[iCount][i] = *(pCurrentText + i);
        //********************* END ******************************
        
        
        /*
        CString str;
        m_editOutput.GetWindowText(str);
        str += arrSzCode[iCount];
        m_editOutput.SetWindowText(str);
        */
        

        pCurrentText += length; //seek current text
        
        if(bEndNewStr) //proyti '\r'&'\n'
            pCurrentText += 2;

        iCount++;
    }
        MessageBox("Write is The Thing :))");        

    for(int j=0; j<nLineCount; j++)
        delete [] arrSzCode[j];
    delete [] arrSzCode;

    delete [] pText;
}




--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.