Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 24 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Доброго времени суток уважаемые программисты!
У меня есть проблемя:
мне необходимо при открытии нового текстового файла заносить его содержимое в StringGrid, который будет динамически создаваться вместе с TabSheet. Необходимо чтобы имя у StringGrid зависили от номера файла.
Изначально не известно сколько файлов будет открыто.

проблема в том как это сделать


Последний раз редактировалось W[E]RTEX 28.10.2005 21:37, всего редактировалось 1 раз.


Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
И где проблема?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
W[E]RTEX действительно в чем проблема? Организовуешь динамический массив стринггридов и создаешь по надобности.

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Давай по порядку.
1. Почему текстовый файл надо в StringGrid? Если обьясниш точнее что надо сделать, я тебе примерчик набросаю :)
2. Я так понял, что после редактирования надо писать обратно в файл?
Вообщето тут надо применять MDI раз уж у тебя работа идет с несколькими файлами сразу. Пример простого текстового редактора должен быть в поставке Delphi.


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Работать буду с несколькими файлами.
Содержимое файлов хочу поместить либо в ListBox либо в StringGrid, пока смотрючто удобнее(крсивее).
Заранее количество открываемых файлов не известно, но мне кажется больше 25 файлов врятли кто будет открывать.
После редактирования действительно все сохраняем в файл.

значит как я понял необходимо создать массив:
Код:
StrGrid: arrary [1..25] of TStringGrid;
...
{потом значит при открытии файла создаем для него StrGrid}
...
i:=0;
...
StrGrid[i]:=TStringGrid.Create(Self);
with StrGrid[SGc] do
begin
{параметры задаем}
end;
{запихиваем туда строки из файла}

но у меня не получается определить с какой именно таблицей идет работа.


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Мдяяя уж. Ты про MDI что нибудь знаеш? Видимо нет. Советую малость почитать. Твоя проблема решается элементарным способом.

Добавлено спустя 15 минут, 1 секунду:
Вот лови пример текстового редактора на скорую руку.
http://cp.people.overclockers.ru/cgi-bi ... ditest.rar


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
проблема!!!
файлик то не качается!!


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
W[E]RTEX если фаил не качаеться, то тогда врядли что-то у тебя получиться :D
Цитата:
» Скачать файл mditest.rar
- туда жми.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Ray Adams писал(а):
Ты про MDI что нибудь знаеш?


да знаком, но это не очень удобно.
хотелось бы что-то на вид оперы или как в excel


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
W[E]RTEX писал(а):
хотелось бы что-то на вид оперы или как в excel

Это всего лиш модификация того же MDI. Видел к примеру Avant Browser? Там тоже табы есть, но они прилеплены к окнам. Так что не надо изорбретать колесо!
А если уж так страшно хочется все на динамику посабить, то почитай хелпик по работе с компонентами у TForm.


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
а как без динамики-то обойтись? так и так ее использовать.
Седня попробовал работать с mdi, чтобы приделать вкладки нкжно испльзовать TabControl, правильно?, дак вот если вешеть на каждую вкладку окно документа, то получится Avant Browser, так ?. но тут возникла проблема как сделать так чтобы пользователь не наблюдал как при добавлении документа дочерняя форма раскрывается на всю радительскую.


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
W[E]RTEX писал(а):
Седня попробовал работать с mdi, чтобы приделать вкладки нкжно испльзовать TabControl, правильно?

Да.

W[E]RTEX писал(а):
не наблюдал как при добавлении документа дочерняя форма раскрывается на всю радительскую.

Честно говоря сам ищу этот способ!

Хотя тее можно и без MDI обойтись, с одной лишь динамикой и бес всяких там массивов.
Ща набросаю тебе пример.

Добавлено спустя 29 минут, 8 секунд:
Вот лови.
http://cp.people.overclockers.ru/cgi-bi ... sheets.rar


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Ray Adams
Ray Adams писал(а):
Хотя тее можно и без MDI обойтись, с одной лишь динамикой и бес всяких там массивов.
Ща набросаю тебе пример.

Тоже глянул – изящно. :)
А это тебе, мот и сгодиться. ;)

ClearingForTheProjects.cmd
Код:
@cls
@echo begin...AutoDeleting
@echo Off
del /s *.~*;*.dcu;*.cfg;*.dof;*.exe;*.ddp
@echo end.....AutoDeleting
exit


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Ray Adams писал(а):
Честно говоря сам ищу этот способ!


Может такой код поможет:
Код:
type
  ... = class(TForm)
  { other stuff above }
  procedure CreateParams(var Params: TCreateParams); override;
  { other stuff below }
end;

...

procedure tMdiChildForm.CreateParams(var Params: tCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style and (not WS_CAPTION);
end;


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
W[E]RTEX Ты пример мой глянул?


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Ray Adams, пример посмотрел, именно то что надо. Спасибо.

Сделал контекстное меню: "Выделить все"
Но возникла проблема вот здесь
Код:
     if PageControl1.ActivePage<>nil then
     begin
          tb:=PageControl1.ActivePage;
          if tb.Components[0] = nil then exit;
          te:=tb.Components[0] as TMyMemo;
          te.Lines.SaveToFile(te.FileName);
     end;


выдает ошибку:
Class: EListError
msg: List index out of bounds


После долгих мучений попробовал Components[0] исправить на Controls[0], щас вроде работает.
А в чем отличие Components[0] от Controls[0] это же вроде обращение к определённому компаненту с индексом [n], так ?


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
W[E]RTEX писал(а):
выдает ошибку: Class: EListError msg: List index out of bounds

У меня не выдает. У тебя Delphi 7?


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
W[E]RTEX
W[E]RTEX писал(а):
Сделал контекстное меню: "Выделить все"
Но возникла проблема

Упс, какое еще контекстное меню ты сделал? :)
Memo и так имеет нужное контекстное меню.

W[E]RTEX писал(а):
После долгих мучений попробовал Components[0] исправить на Controls[0], щас вроде работает.
А в чем отличие Components[0] от Controls[0] это же вроде обращение к определённому компаненту с индексом [n], так ?

Ты можешь использовать Controls для обращения к дочерним визуальным компонентам, а свойство Components – для обращения ко всем компонентам формы, независимо от родителя.
Родителя можно определить по свойству Parent, а владельца по свойству Owner.

Ray Adams
Ray Adams писал(а):
У меня не выдает.

У меня тоже ошибки нет, видно он что-то замутил. :)


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Ray Adams писал(а):
У тебя Delphi 7?
- да D7.Enterpris(b 4.453) (а новее можно найти?)

Дело в том что я всетаки решил
W[E]RTEX писал(а):
мне необходимо при открытии нового текстового файла заносить его содержимое в StringGrid

что остановлюсь на StringGrid (SG).

Для удобства пользователя решил сделать такое контекстное меню для SG:
Код:
    ActionRemoveSelected: TAction;
    ActionRemoveAll: TAction;
    ActionMoveUp: TAction;
    ActionMoveDown: TAction;
    ActionMoveTop: TAction;
    ActionMoveBottom: TAction;
    ActionItemsSelectAll: TAction;
    ActionItemsSelectNone: TAction;
    ActionItemsSelectInvert: TAction;

Решил делать как в книшке написано, через TActionList, как выяснилось действительно удобно.
Дак вот:
Создаю я значит при открытии:
Код:
{ Создаем страницу для файла }     
    TabSheet:=TTabSheet.Create(self);
     with TabSheet do
     begin
          PageControl:= PCMain;
          Visible:=True;
          Caption:='Секция '+IntToStr(q);//OpenDialog1.FileName;
          PopupMenu:=PopupMenuTabSheet;[i][u]почему то не хочет работать в таком виде, работает только если самому PageControl'у задать это свойство[/u][/i]
     end;
{ Создаем таблицу для файла }
     StrGrid:=TMyStringGrid.Create(Self);
     with StrGrid do
     begin
          Parent:=TabSheet;
          FixedRows:=0;
          FixedCols:=0;
          GridLineWidth:=0;
          Align:=alClient;
          ColCount:=1;
          DefaultRowHeight:=16;
          PopupMenu:=PopupMenuStringGrid;
          FileName:=OpenDialog1.FileName;
     end;
{ Открываем файл и заносим его содержимое в таблицу }
     AssignFile(FileTXT,OpenDialog1.FileName);
     Reset(FileTXT);
     while not Eof(FileTXT) do
     begin
          Readln(FileTXT,tmp);
          StrGrid.Cells[0,i]:=tmp;
          i:=i+1;
          StrGrid.RowCount:=i;
     end;
     CloseFile(FileTXT);
{ Делаем ширину столбца по ширине данных }
     with StrGrid do
     begin
          MaxWidth:=0;
          for c:=0 to RowCount - 1 do
          begin
               w := Canvas.TextWidth(Cells[0,c]);
               if w > MaxWidth then MaxWidth := w;
          end;
          if MaxWidth<Width then
             ColWidths[0]:=Width-5
          else
             ColWidths[0] := MaxWidth + 5;
     end;
     PCMain.ActivePage:=TabSheet;

потом значит:
Код:
procedure TMainForm.ActionItemsSelectAllExecute(Sender: TObject);
var
  SRect: TGridRect;
begin
     if PCMain.ActivePage<>nil then
     begin
     TabSheet:=PCMain.ActivePage;
     if TabSheet.Components[0] = nil then exit;
     StrGrid:=TabSheet.Components [0] as TMyStringGrid;

  with StrGrid do
  begin
    SetFocus;
    SRect.Top := 0;
    SRect.Left := 0;
    SRect.Bottom := RowCount;
    SRect.Right:=1;
    Selection := SRect;
  end;

end;

если использую Components, то возникает ошибка, если Controls-все нормально.
Кая понял:
if PCMain.ActivePage<>nil then //проверяем, активна ли страница ?
begin
TabSheet:=PCMain.ActivePage; //присваиваем
if TabSheet.Components[0] = nil then exit; // если компонентов нет, ничего не делаем
StrGrid:=TabSheet.Components [0] as TStringGrid; если есть, присваиваем
..... и т.д.
end;


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
W[E]RTEX писал(а):
if PCMain.ActivePage<>nil then //проверяем, активна ли страница ?

Да, проверяем есть лы выбьранная страница

W[E]RTEX писал(а):
if TabSheet.Components[0] = nil then exit; // если компонентов нет, ничего не делаем

Точнее так, если нулевого компонента нету, то выходим. Так как у тебя там будет ТОЛЬКО один стринггрид, то он всегда имеет индекс 0.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 24 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan