Member
Статус: Не в сети Регистрация: 13.03.2007 Откуда: Черная дыра
Нужна помощь, имеется база Data.mdb и запрос
Код:
with DBDataModule.ADOQuery1 do begin Close; SQL.Clear; SQL.Add('Select *'); SQL.Add('From DB'); if EditSearch.Text <> '' then SQL.Add('Where upper(AMainTitle) LIKE "%' + uppercase(EditSearch.text) + '%"'); SQL.Add('Order by AMainTitle'); Active := True; end;
раньше когда использовалась база Data.db (paradox) все работало а теперь выдает ошибку raised exception class EOleException with message 'Неопределенная функция 'upper' в выражении'
Member
Статус: Не в сети Регистрация: 13.06.2007 Откуда: UK/Glasgow Фото: 0
Проблема с отправкой данных Socket.SendText Проблема в том, что мне надо при подсоединении клиента отправить ему элементы ListBox'a. Решил организовать на стороне сервера цикл типа
Код:
ServerSocket.Socket.Connections[0].SendText(IntToStr(Listbox.Items.Capacity)); //Количество элементов
for i:=0 to Listbox.items.capacity-1 do ServerSocket.Socket.Connections[0].SendText(Listbox.Items[i]);
То есть в начале я отправляю количество элементов (чтобы на стороне клиента было известно количество элементов), а потом по одному отправлять строки листбокса.
Вот код на стороне клиента:
Код:
n:=StrToInt(Socket.ReceiveText); // Первым делом узнаём количество элементов
for i:=0 to n-1 do Listbox.Items.Add(Socket.ReceiveText);
Но в итоге получается полная каша. Всё это приходит за один раз. То есть цикл просто берёт, сначала складывает все строки воедино и потом её отправляет (одну).
Например, у нас есть листбокс, и в нём 3 строки. Тогда придёт вот такое:
Код:
3перваястрокавтораястрокатретьястрока
Хотелось бы узнать, как сделать по человечески? Может, есть аналоги замечательных функций из РНР explode/implode, которые умели склеивать и разбивать строки, используя разделители?
Member
Статус: Не в сети Регистрация: 04.05.2007 Откуда: Немеция Фото: 0
zextol гы, успел прочитать )
SwiPTorrent а ты отправь все три пункта одной строкой с разделителями, на стороне сервера разбери в обратном порядке. А в листбоксе случайно нет возможности отправить все одной строкой, как, например, в TStringList/TStrings? Наизусть не помню, а делфи под рукой нет, посмотри, может есть?
_________________ i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО
Последний раз редактировалось Beginner_ 25.05.2010 23:35, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 13.06.2007 Откуда: UK/Glasgow Фото: 0
Цитата:
на стороне сервера разбери в обратном порядке.
А вот как это сделать? Если бы у меня были значения фиксированной длины, то я бы так выдёргивал их, зная откуда начинать их копировать. И у меня наоборот, сервер посылает текущий список игроков из листбокса, только что подключившемуся клиенту.
Думал попробовать через буфер слать, ничего не вышло, одни нули кажет. Есть ещё метом через TStream, но я им пользоваться не умею.
Member
Статус: Не в сети Регистрация: 04.05.2007 Откуда: Немеция Фото: 0
/SwiPTorrent Если листбокс не имеет что-то типа Listbox.Items.Text, как Мемо, например, или стринглист и нет готовых функций в самой делфи, то напиши две простенькие функции, в одной, выполняемой на клиентской стороне, пройдясь в цикле по листбоксу и собери все элементы в одну строку, добавив между ними какой-нибудь разделитель, т.е. что-то вида
Код:
lbItems := ''; for i := 0 to lb.count - 1 do lbItems := lbItems + lb.Items[i] + ';'
В качестве разделителя используй символ, который в этот листбокс точно не попадет. В другой, на серверной стороне, обратную функцию. Находишь первое вхождение разделителя, береш все, что до него, это твой элемент списка, и так с скаждым последующим. Поиск вхождения строки в подстроку - Pos/PosEx, вторая тут даже лучше пожалуй. Синтаксис в самой делфи увидишь. Хотя наверняка есть какие-то аналоги, да и где-то в интернете видел готовые юниты, с кучей функций для работы со строками. Поискать только нужно. Хотя мне было бы проще самому накатать, сложного тут ничего по сути нет.
_________________ i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО
Member
Статус: Не в сети Регистрация: 04.05.2007 Откуда: Немеция Фото: 0
SwiPTorrent добрался до делфи, есть там такая вещь. Используй ListBox.Items.Text, в одном месте читаешь у отправителя и передаешь, в другом читаешь и присваиваешь получателю.
_________________ i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО
либо, более правильный вариант, перед каждой строкой передавать её длину, а на клиенте сначала вычитывать длину, потом вычитывать ровно столько байт из сокета и запихивать в листбокс
Member
Статус: Не в сети Регистрация: 04.05.2007 Откуда: Немеция Фото: 0
А если делать самому функцию, то я б сделал так: "сворачивающая" функция:
Код:
s := ''; for i := 0 to lst1.Count - 1 do s := s + lst1.Items.Strings[i] + '#';
и "разворачивающая":
Код:
procedure Explode(sInput: string; var lbList: TListBox); var sTmp: string; begin sTmp := sInput;
while (pos('#', sTmp) > 0) do begin lbList.Items.Add(Copy(s, 1, Pos('#', sTmp) -1 )); Delete(s, 1, Pos('#', sTmp)); end; end;
Вызов функции:
Код:
Explode(s, MyListBoxToFill);
Можно сделать без удаления, но тогда нужно использовать функцию PosEx и запоминать положение найденного символа, чтобы при следующем вызове функция искала не сначала, а со смещением.
_________________ i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО
А если делать самому функцию, то я б сделал так: "сворачивающая" функция:
Код:
s := ''; for i := 0 to lst1.Count - 1 do s := s + lst1.Items.Strings[i] + '#';
и "разворачивающая":
Код:
procedure Explode(sInput: string; var lbList: TListBox); var sTmp: string; begin sTmp := sInput;
while (pos('#', sTmp) > 0) do begin lbList.Items.Add(Copy(s, 1, Pos('#', sTmp) -1 )); Delete(s, 1, Pos('#', sTmp)); end; end;
Вызов функции:
Код:
Explode(s, MyListBoxToFill);
Можно сделать без удаления, но тогда нужно использовать функцию PosEx и запоминать положение найденного символа, чтобы при следующем вызове функция искала не сначала, а со смещением.
Member
Статус: Не в сети Регистрация: 04.05.2007 Откуда: Немеция Фото: 0
SpuTnick т.е.?
Ребят, кто сталкивался с такой ерундой: цикл следующего вида:
Код:
for i := 0 to Length(sDatabasePath) - 1 do begin s := sDatabasePath[1] ... end
(копирование в цикле здесь просто для примера, в оригинале тоже используется i) считает вопреки логике не от 0 до, например, 10, а наоборот, начинает с 10 и заканчивает 0. В чем проблема - не можем пока понять. Делфи 2006, настройки по умолчанию. При этом если внутри этого цикла добавить команду
Код:
if i = 0 then ;
, то считать начинает правильно. Звучит бредово, но это так
_________________ i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения