![]() |
AW: Spalten überprüfen...
Ich habe wie gesagt 3 Units :
1 Unit : Da werden die Funktionen programmiert. 2.Unit(VCL-Formular) : Code+Design, da wird definiert welche Überprüfung(Funktion) für welche Spalte durchzuführen ist ( in den ComboBoxen). 3.Unit (VCL-Formularanwendung). Da wurde schon alles (richtig) programmiert. und genau beim Prozedur SpeichernClick muss die Abfragen gemacht werden damit es eine Fehlermeldung gibt..!! Ich weiss nicht wie ich 3 Code miteinander verbinde.. Wo soll ich was aufrufen.. -(? Ich brauche Ihre Hilfe.. Ich komme nicht weiter! |
AW: Spalten überprüfen...
Nur mal ganz schnell im vorbeischauen
warum hast Du Unit2 und Unit3 da wird doch das gleiche gemacht??? Wnn Du in Unit2 die Funktionen aus Unit1 brachst dann
Delphi-Quellcode:
Analog natürlich auch für andere Units. Nur bekommst Du ein Problem wenn Du
Uses
UNIT1, {Funktionen für ...} noch mehr units....... ;
Delphi-Quellcode:
Unit1
uses unit2;
Delphi-Quellcode:
verwenden willst.
Unit2
uses unit1; Funktionen, die in mehreren Units gebraucht werden gehören in eine eigene Unit:
Delphi-Quellcode:
Und was Deine Doppelsuche angeht, es wäre wahrscheinlich besser die Daten in einer nonvisuellen Komponente/Struktur zu bevorraten (z.B. Array of Record), dort die Suche/ den Vergleich durchzuführen, in dieser oder einer zweiten Struktur die entsprechenden Informationen/Markierungen zu hinterlegen und diese dann in einem Grid anzuzeigen.
Unitx
blablabla Unit1 uses unitx; unit2 uses unitx; Unit3 uses unitx; etc. (aber das wurde glaub ich auch schon vorgeschlagen) Gruß K-H |
AW: Spalten überprüfen...
Vielen Danke für die Antwort..-)
Wie gesagt Der Editor war schon programmiert (Nicht von mir.. bin noch ein Anfänger). Mit dem Editor kann man Dateien öffnen und sie mit den Funktionen Suchen/Ersetzen, finden...bearbeiten. Die erste Aufgabe war : dem Projekt eine neue Unit hinzufügen und eine Funktion schreiben, die die erste Spalte auf doppelter Eintrag überprüft und wenn ein Doppelter Eintrag vorkommt, eine Fehlermeldung wird ausgegeben. Das war einfach Ich habe sie programmiert.. (Ob Cells[0,a]=Cells[0,c]).. das war ja einfach. Dann zwei andere Funktionen. die zweite Aufgabe : Es soll die einzelnen Spalten mit den unterschiedlichen Inhalten der (verschiedenen) Tabellen überprüft werden. Anforderungen : Eine neue Formular zu erstellen, Da kann man die Regeln definieren (im ComboBox1 : MyRegeln1..MyRegeln9) ist aber egal. im GroupBox sind 15 ComboBoxen mit den gleichen Items (Funktionen). ComboBox1 für Spalte1.. ComboBox2 für Spalte2..usw. Da wird eingestellt welche Überprüfung für welche Spalte.. In der schon programmierten Unit (unit1) des Editors muss beim Prozedur SpeichernClick die Abfrage gemacht. Denn wenn ich in der Tabelle was bearbeitet habe und im Menu über Datei : Speichern klicke soll die Überprüfung durchgeführt und eine Fehlermeldung ausgegeben werden. Leider kann ich das nicht anders machen und muss meine Funktion/Funktionen umprogrammieren dass sie von der Einstellung der ComboBoxen abhängig werden.Und weiss nicht wo ich genau die Abfragen tue.. Zu Unit1 : wo die Funktion/Funktionen sind.
Delphi-Quellcode:
Zu Unit2 : Code+Design
function TMyChek.MyChekGleich(StringGrid:TggStringGrid; Spaltennummer:Integer):Integer ;
//wobei ich die Funktion umbennenen würde, in das was sie macht, nämlich die erste Zeile liefern, //in der was doppelt vorkommt also somit sowas wie: //function TMyChek.GetFirstRepetition(StringGrid:TggStringGrid; Spaltennummer:Integer):Integer ; var a , b ,c : integer; Inhalt_Check : string; iDoppeltcounter:integer; begin iDoppeltcounter:=0; Result:=0;//Ich würde sagen, wenn 0 zurückkommt, gibt es keine Doppelten b:= StringGrid.RowCount; // Anzahl der Zeilen... for a:=0 to b do begin //müsste meiner Meinung nach b-1 sein Inhalt_Check:=StringGrid.Cells[Spaltennummer,a]; //Zeile Um 1 erhöhen... for c:=0 to b do begin //b-1 s.o.? if Inhalt_Check=StringGrid.Cells[Spaltennummer,c] then begin //iDoppeltcounter:=iDoppeltcounter+1; Inc(iDoppeltcounter); if iDoppeltcounter>1 then begin Result:=c; //StringGrid.Selection:= exit; iDoppeltcounter:=0; end; end; end; end; end;
Delphi-Quellcode:
type
Regel = record Spalte : Array [1..15] of string ; Kriterium : string ; end; const MaxAnzahlRegeln=9; const SpaltenAnzahl=15; var MyRegeln : Array [1..MaxAnzahlRegeln] of Regel;
Delphi-Quellcode:
type
TFMRegeln = class(TForm) Label1: TLabel; ... Label15:TLabel; ... ComboBox1 :TComboBox; ... procedure ComboBoxChangeAlg(Sender: TObject);//Hier habe ich in Ereignisse [B]Onchange[/B] 'ComboBoxChangeAlg' für alle ComboBoxen gemacht, damit ich nur ein Prozedur dann habe.. // Zuweisung des ausgewählten Textes der ComboBoxen... Tag:1,2.. 15 procedure TFMRegeln.ComboBoxChangeAlg(Sender: TObject); begin MyRegeln[STrToInt(ComboBox1.Text)].Spalte[(Sender as TComboBox).Tag]:=(Sender as TComboBox).Text; end; [B]Zu Unit3, wo alles programmiert ist (nicht von mir).[/B
Delphi-Quellcode:
...
... /////////////////////////////////////////////////////////////////////////////// ////////////////////////// XML File speichern procedure TForm1.Speichern1Click(Sender: TObject); var MyXML:TBATM4XMLClass; i,r,S:integer; MyCheck:TMyChek; iResult:integer; b : Boolean; begin MyCheck:=TMyChek.Create; iResult:=MyCheck.MyChekGleich(MainGrid); b:=MyCheck.MyChekFloat('10'); //b:=MyCheck.MyChekInteger('10.4') ; if iResult<>-3 then begin Showmessage(' Doppelter Eintrag : ' + IntTostr(iResult)); Freeandnil(MyCheck); if UPPERCASE(copy(Filename,length(Filename)-2,3)) = 'TXT' then begin SavetextFile(); end else begin if Fileexists(Filename) then begin if UPPERCASE(copy(Filename,length(Filename)-2,3)) = 'TXT' then begin SavetextFile(); end; if UPPERCASE(copy(Filename,length(Filename)-2,3)) = 'XML' then begin SaveXMLFile(); end; end; end; end; ... ... Das sind 3 verschiedene Units.. Was soll ich korrigieren? Wie kann ich diese Variable 'Tag' der ComboBoxen ausnutzen, dass meine Funktion es erst nach der Einstellung tut!! Vlt störe ich oder verstehe nicht ganz was ihr vorschlägt.. .Ich bin noch ein Anfänger in Delphi und versuche mich einzuarbeiten und hoffe auf Ihr Verständnis.. Ich wäre sehr dankbar wenn Sie mir helfen können, dass ich es nicht alles ändern muss.. LG |
AW: Spalten überprüfen...
Wenn du immer nur den selben Kram postest, mit Doppelposts pushst usw., dann verlier ich auch irgendwie die Lust zu helfen, schließlich ist es hier im Forum auch nicht üblich die Hausaufgaben komplett zu machen. Daher hier mal mein letzter Ansatz, danach musst du allein weiter machen:
(ist ungetestet, da nur hier in den Editor getippt) Unit 1: Checkfunktionen:
Delphi-Quellcode:
Zu Problem Nr. 2 schau dir wie gesagt mal das Ini-Tutorial an.
unit MyChkXML;
interface uses SysUtils, WinTypes, WinProcs, Messages, Classes,Forms, Dialogs, ExtCtrls, StdCtrls, Buttons,ggStringGrid,Grids ; type TCheck = Record Column:integer; Rule:integer; end; TChecklist = array of TCheck; TMyChek = class private MSG:TStringlist; Checklist:TChecklist; Grid:TStringGrid; function Check(Checknumber:Integer):Boolean; function MyChekGleich(Column:Integer):Boolean; function MyChekInteger(Column:Integer):Boolean; function MyChekFloat(Column:Integer) :Boolean; public procedure AddCheck(Column,Rulenumber); function ExecuteCheck:Boolean; function CheckResults:String; constructor create(AGrid:TStringGrid); destructor destroy; end; implementation constructor TMyChek.Create(AGrid:TStringGrid); begin inherited create; Grid:=AGrid; MSG:=TStringlist.create; end; desctructor TMyChek.Destroy(); begin MSG.Free; inherited; end; procedure TMyChek.AddCheck(Column,Rulenumber); begin SetLength(Checklist,Length(Checklist)+1); Checklist[High(Checklist)].Column:=Column; Checklist[High(Checklist)].Rule:=Rulenumber; end; function TMyChek.ExecuteCheck:Boolean; var i:integer; begin Result:=true; for i:=Low(Checklist) to High(Checklist) do if not Check(i) then Result:=false; end; function TMyChek.Check(Checknumber):Boolean; begin if Checklist[i].Rule = 0 then Result:=MyChekGleich(Checklist[i].Column) else if Checklist[i].Rule = 1 then Result:=MyChekInteger(Checklist[i].Column) else if Checklist[i].Rule = 2 then Result:=MyChekFloat(Checklist[i].Column) else Result:=true; //Keine bekannte Regel, dann immer OK end; function TMyChek.MyChekInteger(Column:Integer):Boolean; var i:Integer; input:String; output:integer; begin Result:=true; for i:=0 to Grid.Rows-1 do //Grid.Rows.Count-1 ??? begin input:=Grid.Cells[Column,i]; if not TryStrToFloat(input,output) then begin if Result then MSG.Add('Spalte: '+IntToStr(Column)+', Regel: 1 (CheckInteger)') MSG.Add('Fehler in Reihe '+IntToStr(i)+': '+input) Result:=false; end; end; end; function TMyChek.MyChekFloat(Column:Integer): Boolean; begin //Analog end; function TMyChek.MyChekGleich(Column:Integer):Booelean ; begin //Schon was schwieriger, aber solltest du auch hinkriegen. end; end. Viel Erfolg, ich bin raus. |
AW: Spalten überprüfen...
Vielen Dank Ralph
Ja du hast recht..sorry Ich versuche es jetzt allein.. Danke alle für Ihre Hilfe..-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz