Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2313 • Страница 113 из 116<  1 ... 110  111  112  113  114  115  116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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' в выражении'

_________________
ClawHammer -> Windsor F2 -> Brisbane G2 -> Callisto C3 (Deneb)
9600PRO -> 6800U -> 8600GT -> 4830



Партнер
 

Member
Статус: Не в сети
Регистрация: 07.01.2010
попробуй заменить upper на UCase, вроде в аксесе оно так называется


 

Member
Статус: Не в сети
Регистрация: 13.03.2007
Откуда: Черная дыра
Beginner_
спасибо за скорый ответ, там действительно нет.
ToSHiC
там вообще ничего не надо переводить и так работает

_________________
ClawHammer -> Windsor F2 -> Brisbane G2 -> Callisto C3 (Deneb)
9600PRO -> 6800U -> 8600GT -> 4830


 

Member
Статус: Не в сети
Регистрация: 13.06.2007
Откуда: UK/Glasgow
Проблема с отправкой данных 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, которые умели склеивать и разбивать строки, используя разделители?

_________________
-=AMD POWER FAN CLUB=-


 

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
Цитата:
на стороне сервера разбери в обратном порядке.

А вот как это сделать? Если бы у меня были значения фиксированной длины, то я бы так выдёргивал их, зная откуда начинать их копировать.
И у меня наоборот, сервер посылает текущий список игроков из листбокса, только что подключившемуся клиенту.

Думал попробовать через буфер слать, ничего не вышло, одни нули кажет. Есть ещё метом через TStream, но я им пользоваться не умею.

_________________
-=AMD POWER FAN CLUB=-


 

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
Статус: Не в сети
Регистрация: 13.06.2007
Откуда: UK/Glasgow
Попробую, спасибо

_________________
-=AMD POWER FAN CLUB=-


 

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
Статус: Не в сети
Регистрация: 07.01.2010
либо, более правильный вариант, перед каждой строкой передавать её длину, а на клиенте сначала вычитывать длину, потом вычитывать ровно столько байт из сокета и запихивать в листбокс


 

Member
Статус: Не в сети
Регистрация: 13.06.2007
Откуда: UK/Glasgow
Вот сделал функцию Explode, вроде бы работает, но может её как-то можно оптимизировать?
Код:
function Explode (var s:string):string;
var next,name:string;
    position,i:integer;
begin
  position:=pos('#',s);
  Delete(s,1,1);
  name:=copy (s,position,pos('#',s)-1);
  next:=copy(s,position,Length(s));
  ShowMessage (name);
  i:=1;
repeat
  position:=pos('#',next);
  name:=copy (next,position+1,pos('#',next)-1);
  next:=copy(next,position+1,Length(next));
  ShowMessage (name);
  inc(i);
until pos('#',next)=0;
ShowMessage (IntToStr(i));
end;

_________________
-=AMD POWER FAN CLUB=-


 

Member
Статус: Не в сети
Регистрация: 04.05.2007
Откуда: Немеция
Фото: 0
SwiPTorrent
все зря ))
передавай Listbox.Items.Text
на принимающей стороне потом делать примерно так:
Код:
Listbox.Items.Text := Socket.ReceiveText

Листбокс получит все элементы на свои места.

_________________
i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО


 

Member
Статус: Не в сети
Регистрация: 13.06.2007
Откуда: UK/Glasgow
Beginner_
Надо же как легко!

_________________
-=AMD POWER FAN CLUB=-


 

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 | СВО


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
Beginner_ писал(а):
А если делать самому функцию, то я б сделал так:
"сворачивающая" функция:
Код:
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
ToSHiC
а я и не говорил, что использовать нужно исключительно этот символ.
Beginner_ писал(а):
В качестве разделителя используй символ, который в этот листбокс точно не попадет.

_________________
i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
так вот почему сразу не подумать и не передавать заранее длину строки?


 

Member
Статус: Не в сети
Регистрация: 04.05.2007
Откуда: Немеция
Фото: 0
ToSHiC
почему-то мне кажется, что "разборная" функция получится сложнее :spy:

_________________
i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО


 

Member
Статус: Не в сети
Регистрация: 08.05.2007
Откуда: скил в BF3?
Подскажите пжалста, а можно как нибудь у стрингрида задать динамическое число строк/столбцов?

_________________
Когда в 1850 году из Европы в Америку привезли первую партию воробьёв, американцы так обрадовались, что закормили их всех до смерти


 

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 ;
, то считать начинает правильно. Звучит бредово, но это так :gun: :insane:

_________________
i7 5930k| Asus Strix x99 | 32Gb DDR4-3000 | EVGA GTX 1080 Ti FE | Phanteks Enthoo Primo | СВО


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2313 • Страница 113 из 116<  1 ... 110  111  112  113  114  115  116  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  



Лаборатория














Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan