Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Проблема с Listbox в Delphi

Автор: Andrey aka Master
Дата сообщения: 16.04.2003 17:07
У меня такая проблема с помошью clietntsocket я загружаю список айпи адрессов с одного сервера, там где-то 305 строк. Я загружаю их в listbox но загружаються не все: где-то 30 строк не отображаються в listbox. Пробовал загружать в мемо, но тоже самое.
Как сделать, что бы отображались все загружаеммые данные?
Вот код программы(может я ченить не правильно делаю!? Подскажите)

=============================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, RXCtrls, glLBox, glHint, ExtCtrls, RXClock,
RXShell, CoolTrayIcon, X2000OpenDialog;


type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Button2: TButton;
ListBox1: TglListBox;
RxClock1: TRxClock;
CoolTrayIcon1: TCoolTrayIcon;
Button3: TButton;
Save: TSaveDialog2000X;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

procedure CoolTrayIcon1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Open;
ClientSocket1.Port:=2223;
ClientSocket1.Address:='10.0.1.254';


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Close;
close;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
ListBox1.Items.Text:=Socket.ReceiveText;

listbox1.Items.Delete(0);
end;

procedure TForm1.CoolTrayIcon1Click(Sender: TObject);
begin
if form1.Visible=true
then
begin
CoolTrayIcon1.HideMainForm;
end
else
CoolTrayIcon1.showMainForm;

end;

procedure TForm1.Button3Click(Sender: TObject);
var
f:textfile;
begin
if save.Execute then
assignfile(f,save.FileName+'.txt');
if fileExists(save.FileName+'.txt') then
begin
append(f);
writeln(f,listbox1.items.text);
closefile(f);
end
else
begin
rewrite(f);
writeln(f,listbox1.items.text);
closefile(f);
end


end;

end.
=============================================
Автор: vserd
Дата сообщения: 16.04.2003 17:51
А текст полностью принимается? (если его сразу в файл записать)
И возможно ограничение в 64К, хотя вроде оно уже давно не актуально
Автор: Andrey aka Master
Дата сообщения: 16.04.2003 18:47
Да если сохранять сразу в файл то там текст полностью(все строки)?
Это что тогда глюк listbox'a? В memo текст тоже отображается не весь...
Автор: Fatalteser
Дата сообщения: 16.04.2003 20:42
А может там какие нибудь непечатаемые или управляющие символы встречаются или признак конца строки. Вобщем надо просто записть, то что получаешь в файл и в ListBox а затем из ListBox сохранить в другой файл и сравнить файлы по содержимому. А в первом файле также поискать символы с кодами 0-30.
Хотя вроде если там только IP адреса, то таких смволов там быть недолжно, но все же лучше проверить .
Автор: Andrey aka Master
Дата сообщения: 16.04.2003 21:53

Цитата:
Fatalteser

Там такой текст:

;(c) "тут фамилия и имя"
[Addresses]
10.0.42.7
10.0.100.2
10.0.42.3
10.0.100.20
10.0.50.5
..........
10.0.53.13
10.0.8.1
10.0.57.4
10.0.27.250

[Aliases]

Непечатаемых символов там нет; этот текст я могу вставить в листбокс просто так... но
айпи все время обновляются поэтому мне надо чтобы текст грузился с сервака.

Кстати никто не знает функции для сравнения строк: есть текст в двух файлах - надо сравнить и высести отличия(те строки которых нет в первом файле)

Добавлено

Цитата:
Да если сохранять сразу в файл то там текст полностью(все строки)?
Это что тогда глюк listbox'a? В memo текст тоже отображается не весь...


Сори... Один раз текст принялся полностью и опять не принимается....
Вобше-то он и в лист время от времени проинимается полностью.
Наверно это баг clientsocket'а. Я гте-то читал, что он может передавать только 8кб, а что бы принять больше надо разбивать пакет, но это вроде для старого Delphi
Автор: GreyGendalf
Дата сообщения: 17.04.2003 10:16
Andrey aka Master
как я понял listbox заполняется в TForm1.ClientSocket1Read,
ну а там listbox заполняется от Socket.ReceiveText;
значит рыть нужно в TClientSoccket.

проверить можно очень просто,
var
xTxt: String;

потом xTxt := Socket.ReceiveText;
во время отладки посмотри xTxt.
Автор: Tishka
Дата сообщения: 17.04.2003 14:05
Ни каких проблем с ListBox'ами не бывает. Это вообще самый устойчивый Control.

1.
Почему бы не попробовать Listbox1.Items.Add('Очередная строка'). При этом, перед вставкой, можно проанализировать содержимое этой строки (стоит ли вставлять).

2. Построчное сравнение содержимого:
var
I: Integer;
begin
if ListBox1.Items.Count > ListBox2.Items.Count
then // В ListBox1 больше строк чем ListBox2
else // В ListBox1 меньше строк чем ListBox2

for I := 0 to ListBox1.Items.Count - 1 do
if ListBox2.Items.IndexOf(ListBox1.Items[I]) > 0 // номер строкки в ListBox2
then // Строка из ListBox1 содержится в ListBox2
еlsе // Строка из ListBox1 не содержится в ListBox2
end;

Автор: Andrey aka Master
Дата сообщения: 17.04.2003 14:32
GreyGendalf
А как и чем смотреть xTxt? Softice'ом чтоли ?

Добавлено
Tishka
Мне надо сравнить строк не листбоксов а строки в 2 разных файлах и отличаюшиеся
показать.

Автор: Tishka
Дата сообщения: 17.04.2003 15:39
Указанным выше способом, проверяем наличие строки I-й строки 1-го списка строк (TStrings то где хранятся TListBox.Items или TMemo.Lines) во втором списке строк.

var
I, J: Integer;
begin
...

ListBox1.Items.BeginUpdate; // Что бы не действовало
ListBox2.Items.BeginUpdate; // на нервы и не тормозило.
for I := ListBox1.Items.Count - 1 downto 0 do
begin // Удаление "общих" строк
J := ListBox2.Items.IndexOf(ListBox1.Items[I]);
if J > 0
then
begin
ListBox1.Items.Delete(I);
ListBox2.Items.Delete(J);
end;
end;
ListBox1.Items.EndUpdate;
ListBox2.Items.EndUpdate;
end;




// Строка из ListBox1 содержится в ListBox2
еlsе // Строка из ListBox1 не содержится в ListBox2
end;



end;





Добавлено
Извените, забыл убрать последние 4 строки.

Добавлено
Цикл задом наперёд, потому что записи удаляются и инджексация нарушается.

Добавлено
К стати, перед проверкой на совпадение, не плохо бы проверить оба списка на повторяющиеся строки.
Автор: Andrey aka Master
Дата сообщения: 17.04.2003 16:15
Tishka

Зачем ты мне пишешь код для сравнения строк, которые содержаться в двух листбоксах.

Цитата:
Мне надо сравнить строки не листбоксов а строки в 2 разных файлах и отличаюшиеся
показать.

Автор: Tishka
Дата сообщения: 17.04.2003 16:54
Простейшее решение - стандартная DOS'овская команда fc file1.txt file2.txt - сравнивает файлы и показывает различия. Но она не способна анализировать содержимое файлов. И поэтому, если речь идёт о теме обсуждения, то лучше загрузить содержимое файлов в TStrings'ы отсортировать их и сравнить.

Автор: Andrey aka Master
Дата сообщения: 17.04.2003 21:41
Ну скажите ктонить как реализовать коннект к серваку и полученные данные гденить сохранить!
Автор: GreyGendalf
Дата сообщения: 18.04.2003 05:07
Andrey aka Master
нет, обычным дельфовым дебагером.
зачем сложности на ровном месте?

ЗЫ
хотя наверное можно и SoftIce'ом...
как ты наверное понял, проблема в сокетах...
Автор: woffer
Дата сообщения: 19.04.2003 03:06

Цитата:
Ни каких проблем с ListBox'ами не бывает. Это вообще самый устойчивый Control.

Неправда ваша .

Цитата:
Почему бы не попробовать Listbox1.Items.Add('Очередная строка').

У меня этот самый listbox выдавал enought of memory при достаточном большом кол-ве строк.
Автор: Andrey aka Master
Дата сообщения: 19.04.2003 06:56
Когда происходит считывание данных сокета на долю секунды в листбоксе видно все строки, а потом некоторые куда-то изчезают, причем если сменить листбох на другой контрол или сохранять сразу в файл то происходит тоже самое
Автор: Felix
Дата сообщения: 19.04.2003 10:14
Конечно, так помогать нехорошо, но всё же:

в директории \demos\internet\chat есть пример чата написанного на сокетах.
Може быть проще его приспособить под себя?, тем более, что он работает стабильно.
Автор: Andrey aka Master
Дата сообщения: 19.04.2003 11:32
Felix
Спасибо это в натуре то, что мне надо, только переделать немного и все работает

Страницы: 1

Предыдущая тема: Из строки текста сделать массив слов


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.