![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Тема : Ввод и вывод данных в потоках (TMemoryStream).
Вопрос такой: Считываем из потока: Код:
var
SMin,SMout: TMemoryStream;
m,s: Real;
….
Begin
….
SMin:= TMemoryStream.Create;
SMout:= TMemoryStream.Create;
SMin.LoadFromFile(AnsiString('c:\on\PROBA\in.txt'));
SMin.Read(m,sizeOf(Real));
….
S:=m+1.00234;
SMout.Write(m,sizeOf(Real));
SMout.SaveToFile('c:\on\PROBA\out.txt');
…
End.В результате в файле все что угодно только не результаты вычисления( Тоже c данными в формате integer. Что делаю не правильно и как это исправить? И еще как из потока считать строку не по символам до #13, а целиком и сразу, если это возможно). Последний раз редактировалось Admin, 20.01.2012 в 15:12. |
|
#2
|
|||
|
|||
|
Несколько странно выглядят эти строки
S:=m+1.00234; SMout.Write(m,sizeOf(Real)); Может быть все- таки так: Код:
S:=m+1.00234; SMout.Write(S,sizeOf(Real)); |
|
#3
|
||||
|
||||
|
И ещё, может потребоваться использовать свойство Position.
|
|
#4
|
|||
|
|||
|
Цитата:
![]() |
|
#5
|
|||
|
|||
|
Если кто сталкивался с такой задачей, подскажите
![]() |
|
#6
|
||||
|
||||
|
У меня вопрос (если задаю не там, извините, я только зарегистрировался).
Сделал несколько TStringList в разных unit'ах. С процедурой Add проблем нет - всё работает как надо. А вот Insert почему-то не хочет, выскакивает ошибка: "list index out of bounds (1)", и ещё Free тоже не работает и тоже выскакивает ошибка. Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
end;
var
Form2: TForm2;
ts:TStringList;
implementation
uses unit1;
procedure TForm2.Button2Click(Sender: TObject);
begin
//ts.Free;
Close;
end;
procedure check;
begin
with Form2, unit1.Form1 do
begin
Label3.Visible:=CheckBox1.Checked;
Label8.Visible:=CheckBox1.Checked;
Label4.Visible:=CheckBox2.Checked;
Label9.Visible:=CheckBox2.Checked;
Label2.Visible:=CheckBox3.Checked;
Label7.Visible:=CheckBox3.Checked;
Label1.Visible:=CheckBox4.Checked;
Label6.Visible:=CheckBox4.Checked;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
check;
ts.Clear;
ts.Add(BoolToStr(CheckBox1.Checked));
ts.Add(BoolToStr(CheckBox2.Checked));
ts.Add(BoolToStr(CheckBox3.Checked));
ts.Add(BoolToStr(CheckBox4.Checked));
ts.SaveToFile('Settings\Config.cfg');
//ts.Free;
Form2.Close;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
ts:=TStringList.Create;
if FileExists('Settings\Config.cfg')=false
then Form2.Button1Click(Sender)
else begin
ts.LoadFromFile('Settings\Config.cfg');
CheckBox1.Checked:=StrToBool(ts.Strings[0]);
CheckBox2.Checked:=StrToBool(ts.Strings[1]);
CheckBox3.Checked:=StrToBool(ts.Strings[2]);
CheckBox4.Checked:=StrToBool(ts.Strings[3]);
Form2.Button1Click(Sender);
end;
end;
end.Код:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm4 = class(TForm)
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form4: TForm4;
tar:TStringList;
implementation
procedure TForm4.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm4.Button1Click(Sender: TObject);
begin
tar:=TStringList.Create;
tar.Clear;
if (LabeledEdit1.Text<>'') then tar.Insert(0,LabeledEdit1.Text);
if (LabeledEdit2.Text<>'') then tar.Insert(1,LabeledEdit2.Text);
if (LabeledEdit3.Text<>'') then tar.Insert(2,LabeledEdit3.Text);
tar.SaveToFile('Settings\Tarif.cfg');
//tar.Free;
end;
end.Последний раз редактировалось R-18Rus, 08.04.2012 в 19:11. |
|
#7
|
||||
|
||||
|
если не выполнилось первое условие, а StringList.Count==0, то при выполнении вставки в первую (или вторую) строку и вызывается ошибка.
может так лучше будет Код:
procedure TForm4.Button1Click(Sender: TObject);
begin
tar:=TStringList.Create;
tar.Clear;
if (LabeledEdit1.Text<>'') then tar.Insert((tar.Count-1),LabeledEdit1.Text);
if (LabeledEdit2.Text<>'') then tar.Insert((tar.Count-1),LabeledEdit2.Text);
if (LabeledEdit3.Text<>'') then tar.Insert((tar.Count-1),LabeledEdit3.Text);
tar.SaveToFile('Settings\Tarif.cfg');
//tar.Free;
end;и сделайте ts:TStringList локальной, все равно создаете и удаляете (не всегда) при каждом нажатии кнопки, тогда и с Free вопрос разрешится |
|
#8
|
||||
|
||||
|
Цитата:
Ещё объясните, пожалуйста, вот это: tar.Count-1. Цитата:
|
|
#9
|
||||
|
||||
|
c примером я погорячился, так тоже будут ошибки, используйте метод Add (так же, как и в Form2 по нажатию Button1)
Цитата:
да и вообще ознакомьтесь |
|
#10
|
||||
|
||||
|
Да, пример я опробовал - те же лаги.
Цитата:
Что значит Count я знаю, почему Вы предлогаете Count-1? А ещё где тут может быть ошибка? Код:
procedure TForm1.N3Click(Sender: TObject); var proezd:TStringList; begin if OpenDialog1.Execute then begin Proezd:=TStringList.Create; proezd.LoadFromFile(OpenDialog1.FileName); Label6.Caption:=proezd.Strings[0]+' руб.'; Label7.Caption:=proezd.Strings[1]+' руб.'; Label8.Caption:=proezd.Strings[2]+' руб.'; Label9.Caption:=proezd.Strings[3]+' руб.'; end; end; procedure TForm1.N4Click(Sender: TObject); var proezd:TStringList; begin if SaveDialog1.Execute then begin Proezd:=TStringList.Create; proezd.Add(Label6.Caption); proezd.Add(Label7.Caption); proezd.Add(Label8.Caption); proezd.Add(Label9.Caption); proezd.SaveToFile(SaveDialog1.FileName); OpenDialog1.FileName:=SaveDialog1.FileName; end; end; P.S. Почему меня постоянно выкидывает из аккаунта на форуме? Порой, на страницу зайду - авторизован, куда-то перемещусь - уже не авторизован. Последний раз редактировалось R-18Rus, 09.04.2012 в 20:22. |
|
#11
|
||||
|
||||
|
так у вас всегда будут значения переменных в своей строке (если в каком-либо LabeledEdit'e не будет данных, на месте этого значения будет пустая строка)
Код:
procedure TForm4.Button1Click(Sender: TObject);
var
SList:TStringList;// объявление локальной переменной
begin
SList:=TStringList.Create;
SList.Clear;
SList.Add(LabeledEdit1.Text);
SList.Add(LabeledEdit2.Text);
SList.Add(LabeledEdit3.Text);
SList.SaveToFile('Settings\Tarif.cfg');
SList.Free;
end;Count-1: индекс последнего элемента в спсике ВСЕГДА меньше количества элементов на единицу (элементы нумеруются с нуля), т.е. если в листе один элемент, то последний элемент имеет индекс ноль, если два, то последний элемент имеет индекс один и т.д. (Count-1) для того, чтобы вставить в позицию последнего элемента, как гарантировано существующего в не пустом списке, то используется Код:
Insert(Count-1,'blablabla'); |
|
#12
|
||||
|
||||
|
А если файл пустой, то Count-1 это строка[-1] -> error.
Цитата:
Цитата:
Что не так с диалогами? Последний раз редактировалось R-18Rus, 11.04.2012 в 18:39. |