Тогда не вижу проблемы. Почти... Потом поймешь, почему "почти":
// Класс формы: 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, и для каждой создает свой СтрингЛист. Вот теперь должно быть понятно, почему я написал "почти". Это все будет работать, только если во всех этих таблицах нужное тебе поле имеет одинаковое название. Иначе - эти названия надо будет тоже где-то хранить, потеряется гибкость. Ну, в общем дальше уже сам додумывай, тебе лучше знать, в каком виде у тебя это все задается, и как используется.
Можно ли сделать так чтобы если например номер 555 содержащийся в стринглисте удалялся из него в случае если этот же номер был введен в другом столбце?
Можно. Как - не спрашивай, я тебе ответить смогу вряд ли. С нуля написать элементарно, со всеми твоими доделками/переделками того, что тут было (теме уже 3 месяца было вообще-то, сколько за это время ты внес корректив в программу по сравнению с первоначальным вариантом - подумать страшно) - скорее всего практически нереально. У тебя налицо ошибка проектирования: тебе надо не "а вот моей правой пятке захотелось, чтобы так...". Сделал. "Ух ты, а вот теперь левой пятке хочется, чтобы еще вот так..." Еще раз сделал, заметь ГОРАЗДО труднее, чем первое. "А теперь вот еще чего хочется..."
Так программы не пишут. Ты должен СРАЗУ, еще до того, как открыл Дельфи, знать, ЧТО и ЗАЧЕМ должна делать твоя программа. И что тебе надо запрограммировать. Если ты этого не знаешь - то будь готов к тому, что для введения каждой новой "фичи" будешь переписывать программу С НУЛЯ заново. Я все сказал. Перелопачивать весь код я не буду. Тебе надо - ты и переделывай, если задачу ставить не научился.
Можно ли обновлять стринг лист нужного столбца чтобы он мог отражать изменения происходящие в процессе работы? Например таким образом: SL.refresh в событии AfterPost? В строке
CreateStrList(Form5.Components[i] as TADOTable, 'txt', Length(arrSL) - 1);
возникает ошибка Constant object cannot be passed as var parametr. В чем тут дело? Вроде в Var все объявлено
При вводе заведомо повторяющегося значения программа не обнаруживает повтор. Но если это значение ввести еще раз, программа об этом сообщает. Почему же она выдает ошибку только со второго раза? Если введено сразу несколько повторов, Label отображает только одно вот так например: 54| а второго нету.. В этом коде повторение Label1.Caption+ так и должно быть?
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;
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] + '*) ';
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 таблице если есть например запись "Сторонник" а вводишь "сТоронник" то добавляется. А если введешь СтронНик например то нормально тогда. Но это видимо у меня что-то не так.