Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCheckListBox, и запись структуры 
V
    Опции темы
~FoX~
Дата 28.3.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 13
Всего: 68



Совсем я затупил что то:
Есть на форме ЧекЛистБокс и две кнопки:

Код

type //Сама структура
  TCheckToFile = record
    MyCheckIt: boolean;
    MyPath: string[255];
  end;
//........................

procedure TForm1.SaveClick(Sender: TObject);
var
  m: array of TCheckToFile;
  j, i: integer;
  FS: TFileStream;
begin
  j := CheckListBox1.Items.Count -1;
  SetLength(m, j);    // Устанавливаем размер структуры
  for i := 0 to j do begin
    m[i].MyCheckIt := CheckListBox1.Checked[i];    // Складываем в структуру состояние чеков из бокса
    m[i].MyPath := CheckListBox1.Items.Strings[i]; // Складываем названия итемов 
  end;
  try
    FS := TFileStream.Create('c:\1.txt', fmCreate); 
    FS.Write(j, SizeOf(j));   // Валим в файл количество итемов
    for i := 0 to j do FS.Write(m[i], SizeOf(m[i])); //Валим структуру в файл
  finally
    FS.Free;
  end;
end;
//...................
procedure TForm1.LoadClick(Sender: TObject);
var
  m: array of TCheckToFile;
  j, i, k: integer;
  FS: TFileStream;
begin
  SetLength(m, 0);
  try
    FS := TFileStream.Create('c:\1.txt', fmOpenRead);
    FS.Read(j, SizeOf(j));  // Читаем количество итемов из файла
    SetLength(m, j);         //Устанавливаем размерность структуры
    for i := 0 to j do FS.Read(m[i], SizeOf(m[i])); //Читаем все в структуру
  finally
    FS.Free;
  end;
end;


И так, в файл структура попадает нормально, из файла она нормально загружается, но как только я тыкаю на CheckListBox прога выпадает с ошибкой. Так же происходить если обратиться к боксам программно...
Код

  for k := 0 to j do begin
    CheckListBox1.Checked[k] := m[k].MyCheckIt;
    CheckListBox1.Items.Strings[k] := m[k].MyPath
  end;


Это происходит только после загрузки структуры.....Я себе всю голову сломал уже


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 28.3.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(~FoX~ @ 28.3.2006, 10:01 Найти цитируемый пост)
    MyPath: string[255];

Так низя. Ты пытаешься переписать первые 2 байта стринга. А это недопустимо.
Сохраняй все вручную.
Прочитать стринг с первыми 2-мя байтами дельфя тебе не даст.

TWriter тебе поможет.
Прикрути его к TFileStream и сохраняй стринг и Checked.
Пусть 2 операции вместо одной, зато массив не нужно создавать.
PM MAIL   Вверх
Romikgy
Дата 28.3.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(~FoX~ @ 28.3.2006, 09:01 Найти цитируемый пост)
прога выпадает с ошибкой

в каком месте и с какой ошибкой?
+ переменую м надо освобождать , в конце процедуры
Цитата(Snowy @ 28.3.2006, 09:32 Найти цитируемый пост)
Так низя. Ты пытаешься переписать первые 2 байта стринга.

Я не такой гуру в дельфи как ты
Snowy, но имхо вполне законное определение типа string[255]


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 28.3.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код
procedure TForm1.Button3Click(Sender: TObject);
var
  i,j:  integer;
  wr:   TWriter;
  FS:   TFileStream;
begin
  j := CheckListBox1.Items.Count -1;
  try
    FS := TFileStream.Create('c:\1.txt', fmCreate);
    wr := TWriter.Create(fs, 1);
    wr.Write(j, SizeOf(j));
    for i := 0 to j do begin
      wr.WriteString(CheckListBox1.Items[i]);
      wr.WriteBoolean(CheckListBox1.Checked[i]);
    end;
    wr.Free; FS.Free;
  Except end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  j, i: integer;
  FS:   TFileStream;
  rr:   TReader;
begin
  try
    FS := TFileStream.Create('c:\1.txt', fmOpenRead);
    rr := TReader.Create(fs, 1);
    rr.Read(j, SizeOf(j));
    CheckListBox1.Clear;
    for i := 0 to j do begin
      CheckListBox1.Items.Add(rr.ReadString);
      CheckListBox1.Checked[i] := rr.ReadBoolean;
    end;
    rr.Free; FS.Free;
  Except end;
end;

Так даже компактней.
Меньше тратится памяти. Файл получается много меньше...
Добавлено @ 10:55
Цитата(Romikgy @ 28.3.2006, 10:38 Найти цитируемый пост)
в каком месте и с какой ошибкой?
В этом:
Цитата(~FoX~ @ 28.3.2006, 10:01 Найти цитируемый пост)
FS.Read(m[i], SizeOf(m[i])); //Читаем все в структуру
Замени в коде на
Код
begin
  m[i].MyPath := 'бла-бла';
  m[i].MyCheckIt := false;
end;
и сразу все заработает...

PM MAIL   Вверх
~FoX~
Дата 28.3.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 13
Всего: 68



Snowy, Спасибо.

Цитата(Snowy @ 28.3.2006, 11:32 Найти цитируемый пост)
Так низя. Ты пытаешься переписать первые 2 байта стринга. А это недопустимо.

Может я от дня рождения ни как не отойду, но я не совсем понял почему?



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 28.3.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Хм. Вроде кофе выпил. А еще торможу.
Ошибка тут:
Код
    SetLength(m, j+1);         //Устанавливаем размерность структуры

Размер массива ты выделяешь на еденицу меньше.
PM MAIL   Вверх
~FoX~
Дата 28.3.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 13
Всего: 68



Snowy, пойду я теперь кофе попью... smile
Спасибо огромное, а то я думал вообще свихнусь к обеду.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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