Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.01.2012, 14:58
SUB SUB вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 3
Репутация: 10
По умолчанию Re: Вопросы новичка

Тема : Ввод и вывод данных в потоках (TMemoryStream).
Вопрос такой:
Считываем из потока:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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  
Старый 20.01.2012, 15:29
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Несколько странно выглядят эти строки
S:=m+1.00234;
SMout.Write(m,sizeOf(Real));
Может быть все- таки так:
Код:
1
2
S:=m+1.00234;
SMout.Write(S,sizeOf(Real));
Ответить с цитированием
  #3  
Старый 20.01.2012, 17:00
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И ещё, может потребоваться использовать свойство Position.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 20.01.2012, 18:15
SUB SUB вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от chainik
Несколько странно выглядят эти строки
S:=m+1.00234;
SMout.Write(m,sizeOf(Real));
Может быть все- таки так:
Код:
1
2
S:=m+1.00234;
SMout.Write(S,sizeOf(Real));
да именно
Ответить с цитированием
  #5  
Старый 27.01.2012, 10:08
SUB SUB вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 3
Репутация: 10
По умолчанию

Если кто сталкивался с такой задачей, подскажите
Ответить с цитированием
  #6  
Старый 08.04.2012, 19:08
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

У меня вопрос (если задаю не там, извините, я только зарегистрировался).

Сделал несколько TStringList в разных unit'ах. С процедурой Add проблем нет - всё работает как надо. А вот Insert почему-то не хочет, выскакивает ошибка: "list index out of bounds (1)", и ещё Free тоже не работает и тоже выскакивает ошибка.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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.
на Free ошибка.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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.
Тут Insert и Free не работают.
__________________
Может быть, я и левша, но я всегда прав!

Последний раз редактировалось R-18Rus, 08.04.2012 в 19:11.
Ответить с цитированием
  #7  
Старый 08.04.2012, 19:51
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

если не выполнилось первое условие, а StringList.Count==0, то при выполнении вставки в первую (или вторую) строку и вызывается ошибка.
может так лучше будет

Код:
1
2
3
4
5
6
7
8
9
10
procedure TForm4.Button1Click(Sender: TObject);
begin
   tar:=TStringList.Create;
   tar.Clear;
   if (LabeledEdit1.Text<>'') then tar.Insert(<b>(tar.Count-1)</b>,LabeledEdit1.Text);
   if (LabeledEdit2.Text<>'') then tar.Insert(<b>(tar.Count-1)</b>,LabeledEdit2.Text);
  if (LabeledEdit3.Text<>'') then tar.Insert(<b>(tar.Count-1)</b>,LabeledEdit3.Text);
  tar.SaveToFile('Settings\Tarif.cfg');
  //tar.Free;
end;

и сделайте ts:TStringList локальной, все равно создаете и удаляете (не всегда) при каждом нажатии кнопки, тогда и с Free вопрос разрешится
Ответить с цитированием
  #8  
Старый 09.04.2012, 18:11
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
если не выполнилось первое условие, а StringList.Count==0, то при выполнении вставки в первую (или вторую) строку и вызывается ошибка.
А почему так?
Ещё объясните, пожалуйста, вот это: tar.Count-1.
Цитата:
и сделайте ts:TStringList локальной
- что это значит (как осуществить)?
Ответить с цитированием
  #9  
Старый 09.04.2012, 19:22
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

c примером я погорячился, так тоже будут ошибки, используйте метод Add (так же, как и в Form2 по нажатию Button1)
Цитата:
вот это: tar.Count-1
Count - свойство стринглиста, возвращающее число строк, в нем хранящееся, см. тут
да и вообще ознакомьтесь
Ответить с цитированием
  #10  
Старый 09.04.2012, 20:05
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Да, пример я опробовал - те же лаги.
Цитата:
используйте метод Add
- метод Add не подходит. В файле хранятся значения некоторых переменных (каждое в своей строке). Поэтому нужна точная адресация. Если можно осуществить как-нибудь по-другому напишите с пояснениями, а то я кроме Insert не знаю.

Что значит Count я знаю, почему Вы предлогаете Count-1?

А ещё где тут может быть ошибка?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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  
Старый 09.04.2012, 20:53
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

так у вас всегда будут значения переменных в своей строке (если в каком-либо LabeledEdit'e не будет данных, на месте этого значения будет пустая строка)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
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;
лучше использовать TIniFile

Count-1: индекс последнего элемента в спсике ВСЕГДА меньше количества элементов на единицу (элементы нумеруются с нуля), т.е. если в листе один элемент, то последний элемент имеет индекс ноль, если два, то последний элемент имеет индекс один и т.д. (Count-1)
для того, чтобы вставить в позицию последнего элемента, как гарантировано существующего в не пустом списке, то используется
Код:
1
Insert(Count-1,'blablabla');
Ответить с цитированием
  #12  
Старый 11.04.2012, 14:49
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

А если файл пустой, то Count-1 это строка[-1] -> error.

Цитата:
если в каком-либо LabeledEdit'e не будет данных, на месте этого значения будет пустая строка
дк. мне пустая не нужна. Они ведь все загружаются и присваиваются переменным.

Цитата:
SList:TStringList;// объявление локальной переменной
Да, вспомнил. Сразу и не догнал. А почему с Free тогда вопрос разрешится?
Что не так с диалогами?

Последний раз редактировалось R-18Rus, 11.04.2012 в 18:39.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025