Можно ли как-нибудь сохранить свою структуру данных (запись), в которой присутствует динамический массив?
Угу, проще всего с помощью БД.
Но мона и без.
Опиши задачу и структуру.
На сколько большими могут быть динамические данные для записи и как много записей планируешь хранить в файле.
А то мот тебе и TClientDataSet c "головой" хватит.
Тут я перемудрил малость, но переделывать уже поздно, да и работать с таким представлением данных мне довольно удобно. Каждый масси в пределах 10-20 элементов (ну может 30, наврядли больше).
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Ray Adams
Цитата:
Ну а накой тогда динаимка то??? Сразу пропиши [0..100] думаю этогj хватит?
Теперь уже легче в ини файл сохранять, чем переделывать, да и с динамическим работать удобней.
Добавлено спустя 3 часа, 20 минут, 58 секунд: Ничего проще юзания IniFiles не придумал. Если кому интересно - накодил следующее:
Запись
Код:
procedure SaveTestDataSourses(); var IniFile: TIniFile; i: integer; begin try IniFile:=TIniFile.Create(ExtractFileDir(Application.ExeName)+'\TestData.INI');
IniFile.WriteInteger('Resistance', 'ArrLength', Length(ValueList.ResistanceList.ValueKom)); for i:=0 to Length(ValueList.ResistanceList.ValueKom)-1 do IniFile.WriteFloat('Resistance','Resist'+IntToStr(i),ValueList.ResistanceList.ValueKom[i]);
IniFile.WriteInteger('CVoltage', 'ArrLength', Length(ValueList.CVoltageList.ValueVolt)); for i:=0 to Length(ValueList.CVoltageList.ValueVolt)-1 do IniFile.WriteFloat('CVoltage','CVolt'+IntToStr(i),ValueList.CVoltageList.ValueVolt[i]);
IniFile.WriteInteger('AVoltage', 'ArrLength', Length(ValueList.AVoltageList.ValueVolt)); for i:=0 to Length(ValueList.AVoltageList.ValueVolt)-1 do IniFile.WriteFloat('AVoltage','AVolt'+IntToStr(i),ValueList.AVoltageList.ValueVolt[i]);
IniFile.WriteInteger('CCurrent', 'ArrLength', Length(ValueList.CCurrentList.ValueAmper)); for i:=0 to Length(ValueList.CCurrentList.ValueAmper)-1 do IniFile.WriteFloat('CCurrent','CAmper'+IntToStr(i),ValueList.CCurrentList.ValueAmper[i]);
IniFile.WriteInteger('ACurrent', 'ArrLength', Length(ValueList.ACurrentList.ValueAmper)); for i:=0 to Length(ValueList.ACurrentList.ValueAmper)-1 do IniFile.WriteFloat('ACurrent','AAmper'+IntToStr(i),ValueList.ACurrentList.ValueAmper[i]);
IniFile.Free; except end; end;
Чтение
Код:
procedure LoadTestDataSources(); var IniFile: TIniFile; i, L: integer; begin if FileExists(ExtractFileDir(Application.ExeName)+'\TestData.INI') then begin L:=0; IniFile:=TIniFile.Create(ExtractFileDir(Application.ExeName)+'\TestData.INI');
L:=IniFile.ReadInteger('Resistance', 'ArrLength', 0); SetLength(ValueList.ResistanceList.ValueKom,L); for i:=0 to L-1 do ValueList.ResistanceList.ValueKom[i]:=IniFile.ReadFloat('Resistance','Resist'+IntToStr(i),0);
L:=IniFile.ReadInteger('CVoltage', 'ArrLength', 0); SetLength(ValueList.CVoltageList.ValueVolt,L); for i:=0 to L-1 do ValueList.CVoltageList.ValueVolt[i]:=IniFile.ReadFloat('CVoltage','CVolt'+IntToStr(i),0);
L:=IniFile.ReadInteger('AVoltage', 'ArrLength', 0); SetLength(ValueList.AVoltageList.ValueVolt,L); for i:=0 to L-1 do ValueList.AVoltageList.ValueVolt[i]:=IniFile.ReadFloat('AVoltage','AVolt'+IntToStr(i),0);
L:=IniFile.ReadInteger('CCurrent', 'ArrLength', 0); SetLength(ValueList.CCurrentList.ValueAmper,L); for i:=0 to L-1 do ValueList.CCurrentList.ValueAmper[i]:=IniFile.ReadFloat('CCurrent','CAmper'+IntToStr(i),0);
L:=IniFile.ReadInteger('ACurrent', 'ArrLength', 0); SetLength(ValueList.ACurrentList.ValueAmper,L); for i:=0 to L-1 do ValueList.ACurrentList.ValueAmper[i]:=IniFile.ReadFloat('ACurrent','AAmper'+IntToStr(i),0);
IniFile.Free; end; end;
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Загрузку я бы сделал функцией:
И при загрузке выполнял бы проверки на наличие нужных данных.
function LoadTestDataSources: Boolean;
… Result:= IniFile.SectionExists('Resistance')
if Result then
begin
Result:= IniFile.ValueExists('Resistance', 'ArrLength');
if Result then
… А то студенты народ сУрьёзный – могут направить в файле так (если доберутся ессно), шо мало не покажется.
Самое интересное то, что пару лет назад делал для соседа в универ тест, правда без сетки, так он тоже наотрез отказывался от БД, мотивируя тем, шо препад особо в этом не рубит.
Его – бедолагу еще и заставили кодировать данные в ini-файле.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Lord_of_Darkness А что тогда мешало писать сразу в бинарный файл??? Вот точно также пиши в бинарник только не как текст а как переменные еще прощен чем с .ini
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
_SGK
Цитата:
Загрузку я бы сделал функцией:
Да проще в try except; обернуть..
Цитата:
А то студенты народ сУрьёзный – могут направить в файле так (если доберутся ессно), шо мало не покажется.
Это все на серваке будет, так шо доберутся наврядли, а если и доберутся и об этом узнают (что скорей всего, то мало не покажется - отчислят...) Asteroid
Цитата:
У INI файлов было ограничение - 32кб
Хватит выше крыши, поверь мне... Ray Adams
Цитата:
А что тогда мешало писать сразу в бинарный файл???
Оказалось проще в ини, и уже сделал, так что...
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Ну, как говорится хозяин-барин.
Тока для загрузки не делай так, как написал для сохранения.
Код:
procedure SaveTestDataSourses(); var IniFile: TIniFile; i: integer; begin try IniFile:=TIniFile.Create(ExtractFileDir(Application.ExeName)+'\TestData.INI'); // Твой код - в случае возникновения ошибки строка IniFile.Free никогда не будет выполнена. IniFile.Free; except end; end;
В конце защищенного блока except { } end, при загрузке все равно нужно информировать приложение (код) о возникновении ошибки.
Adminus Overclockerus
Статус: Не в сети Регистрация: 11.10.2002 Откуда: Default Фото: 0
На Delphi не программировал уже лет 5, а тут потребовалось написать небольшую программу и сразу же столкнулся с проблемой.
Задача - поменять картинку у TBitBtn при нажатии на неё.
Итак, есть:
Код:
Connect: TBitBtn; ImageList1: TImageList;
При этом в ImageList1 "загружены" необходимые картинки.
Код:
procedure TMainForm.ConnectClick(Sender: TObject); var Bmp : TBitmap; begin Bmp := TBitmap.Create; ImageList1.GetBitmap(2,Bmp); Connect.Glyph.Assign(Bmp); Bmp.Free; end;
При этом картинка меняется, НО: она становится непрозрачной и выводится на белом фоне Всякие
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Mech Гм, недолжно такого быть... Проверил у себя - все нормально выводится.
Может у картинки фон "грязный"?
И еще, можно попробовать задать Connect.Glyph.Mask(clBtnFace);
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения