IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3  
 Ответить  Открыть новую тему 
> повторяющиеся данные в dbgrid - ?
сообщение
Сообщение #41


Гость






Тогда не вижу проблемы. Почти... Потом поймешь, почему "почти":
// Класс формы:
type
TForm1 = class(TForm)
// ...
private
{ Private declarations }
arrSL: array of TStringList;
public
{ Public declarations }
procedure CreateStrList(var T: TADOTable; sFieldName: string; i: integer);
end;

procedure TForm1.CreateStrList(var T: TADOTable; sFieldName: string; i: integer);
var s: string;
begin
T.First;
while not T.Eof do begin
s := s + ',' + T.FieldByName(sFieldName).AsString;
T.Next;
end;
arrSL[i] := TStringList.Create;
arrSL[i].Duplicates := dupIgnore;
arrSL[i].Delimiter := ',';
arrSL[i].DelimitedText := s;
end;

procedure TForm1.FormShow(Sender: TObject);
var i: integer;
begin
SetLength(arrSL, 0);

for i := 0 to Form1.ComponentCount - 1 do
begin
if Form1.Components[i] is TADOTable then
begin
SetLength(arrSL, Length(arrSL) + 1);
CreateStrList(Form1.Components[i] as TADOTable, 'txt', Length(arrSL) - 1);
end;
end;
end;
, и пускай программа сама считает, сколько будет ADOTable, и для каждой создает свой СтрингЛист. Вот теперь должно быть понятно, почему я написал "почти". Это все будет работать, только если во всех этих таблицах нужное тебе поле имеет одинаковое название. Иначе - эти названия надо будет тоже где-то хранить, потеряется гибкость. Ну, в общем дальше уже сам додумывай, тебе лучше знать, в каком виде у тебя это все задается, и как используется.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Можно ли сделать так чтобы если например номер 555 содержащийся в стринглисте удалялся из него в случае если этот же номер был введен в другом столбце?

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #43


Гость






Можно. Как - не спрашивай, я тебе ответить смогу вряд ли. С нуля написать элементарно, со всеми твоими доделками/переделками того, что тут было (теме уже 3 месяца было вообще-то, сколько за это время ты внес корректив в программу по сравнению с первоначальным вариантом - подумать страшно) - скорее всего практически нереально. У тебя налицо ошибка проектирования: тебе надо не "а вот моей правой пятке захотелось, чтобы так...". Сделал. "Ух ты, а вот теперь левой пятке хочется, чтобы еще вот так..." Еще раз сделал, заметь ГОРАЗДО труднее, чем первое. "А теперь вот еще чего хочется..."

Так программы не пишут. Ты должен СРАЗУ, еще до того, как открыл Дельфи, знать, ЧТО и ЗАЧЕМ должна делать твоя программа. И что тебе надо запрограммировать. Если ты этого не знаешь - то будь готов к тому, что для введения каждой новой "фичи" будешь переписывать программу С НУЛЯ заново. Я все сказал. Перелопачивать весь код я не буду. Тебе надо - ты и переделывай, если задачу ставить не научился.

Удачи.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


да это не я не научился. в процессе работы люди поняли что им нужно коечто изменить. и спрашивают у меня-а вот можно ли сделать так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #45


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Можно ли обновлять стринг лист нужного столбца чтобы он мог отражать изменения происходящие в процессе работы? Например таким образом: SL.refresh в событии AfterPost?
В строке
CreateStrList(Form5.Components[i] as TADOTable, 'txt', Length(arrSL) - 1);

возникает ошибка Constant object cannot be passed as var parametr. В чем тут дело? Вроде в Var все объявлено

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #46


Гость






Цитата
возникает ошибка Constant object cannot be passed as var parametr.
Ну да, там в заголовке надо поменять:
procedure CreateStrList(const T: TADOTable; sFieldName: string; i: integer);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


При вводе заведомо повторяющегося значения программа не обнаруживает повтор. Но если это значение ввести еще раз, программа об этом сообщает. Почему же она выдает ошибку только со второго раза?
Если введено сразу несколько повторов, Label отображает только одно вот так например: 54|
а второго нету..
В этом коде повторение Label1.Caption+ так и должно быть?
isOk := false; Label1.Caption :=Label1.Caption+ dbSL.Strings[i] + ' | ';

Я все сделал вот таким образом:
type
TForm1 = class(TForm)

private
{ Private declarations }
arrSL: array of TStringList;
SL: TStringList;

public
{ Public declarations }
procedure CreateStrList(const T: TADOTable; sFieldName: string; i: integer);
end;

procedure TForm1.CreateStrList(const T: TADOTable; sFieldName: string; i: integer);
var s: string;
begin
T.First;
while not T.Eof do begin
s := s + ',' + T.FieldByName(sFieldName).AsString;
T.Next;
end;
arrSL[i] := TStringList.Create;
arrSL[i].Duplicates := dupIgnore;
arrSL[i].Delimiter := ',';
arrSL[i].DelimitedText := s;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SL := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
SL.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
var i: integer;
begin
SetLength(arrSL, 0);

for i := 0 to Form1.ComponentCount - 1 do
begin
if Form1.Components[i] is TADOTable then
begin
SetLength(arrSL, Length(arrSL) + 1);
CreateStrList(Form1.Components[i] as TADOTable, 'txt', Length(arrSL) - 1);
end;
end;
end;

procedure TForm5.ADOTable1BeforePost(DataSet: TDataSet);
var
dbSL, findSL: TStringList;
i: integer;
isOK: boolean;
filterStr: string;
const
ORstr: array[boolean] of string = (' OR ', '');
begin
dbSL := TStringList.Create;
dbSL.Delimiter := ',';
dbSL.DelimitedText := DBEdit3.Text;

findSL := TStringList.Create;
findSL.Duplicates := dupIgnore;

isOK := true;
for i := 0 to dbSL.Count - 1 do begin
if SL.IndexOf(dbSL.Strings[i]) > -1 then begin
isOk := false; Label1.Caption := dbSL.Strings[i] + ' | ';
findSL.Add(dbSL.Strings[i]);
end;


if isOK then begin
for i := 0 to dbSL.Count - 1 do begin
SL.Add(dbSL.Strings[i]);
end;
end
else begin
filterStr := '';
for i := 0 to findSL.Count - 1 do begin
filterStr := filterStr + ORstr[i = 0] +
'([txt] LIKE *' + findSL.Strings[i] + '*) ';

end;
DataSet.Cancel;
ADOTable1.Filtered := False;
ADOTable1.Filter := filterStr;
ADOTable1.Filtered := True;

Abort;

end;
dbSL.Free;
end;
end;


Большая просьба показать мне в чем я допустил ошибку

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #48


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Такое впечатление что данные заносятся в SL не при запуске программы, а при вводе их в БД
Ошибку свою понял: стринглисты не заполнялись в OnFormShow smile.gif

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


Код
If DataModule3.Table5.Locate('St_uch',Edit5.Text,[loCaseInsensitive])=true
then
begin
ShowMessage('В таблице уже имеется данная запись!');
edit5.SetFocus;
DataModule3.Table5.Locate('St_uch',y,[loCaseInsensitive]);
exit;
end;
DataModule3.Table5.Append;
DataModule3.Table5.FieldByName('St_uch').AsString:=edit5.Text;
DataModule3.Table5.Post;

я так делаю например.
только вот проблем почему то одна - везде все работает нормально, но в 1 таблице если есть например запись "Сторонник" а вводишь "сТоронник" то добавляется. А если введешь СтронНик например то нормально тогда.
Но это видимо у меня что-то не так.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.01.2021 19:14
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name