[gelöst] String Format / Platzhalter abfragen
[gelöst] String Format / Platzhalter abfragen
Hallo zusammen,
ich möchte meine Windows-Zwischenablage in mein Programm einlesen.
Dies soll allerdings nur passieren, falls eine relevante Textpassage kopiert wurde.
Die Textpassage soll nur eingelesen werden wenn der String mit "(**)" anfängt.
Was anschließend im String kommt ist nicht relevant. Die Sterne sind Platzhalter.
if not Stringname == '(??)???????' then begin
Kennt jemand des Rätsels Lösung?
Danke vorab und Grüße!
ich möchte meine Windows-Zwischenablage in mein Programm einlesen.
Dies soll allerdings nur passieren, falls eine relevante Textpassage kopiert wurde.
Die Textpassage soll nur eingelesen werden wenn der String mit "(**)" anfängt.
Was anschließend im String kommt ist nicht relevant. Die Sterne sind Platzhalter.
if not Stringname == '(??)???????' then begin
Kennt jemand des Rätsels Lösung?
Danke vorab und Grüße!
Zuletzt geändert von l0lhaxx am Mi 3. Aug 2016, 11:53, insgesamt 1-mal geändert.
-
- Beiträge: 470
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: String Format / Platzhalter abfragen
Hi,
ich denke was du suchst ist Pos(), siehe http://www.freepascal.org/docs-html/rtl/system/pos.html.
Das sähe in deinem Fall ungefähr so aus:
ich denke was du suchst ist Pos(), siehe http://www.freepascal.org/docs-html/rtl/system/pos.html.
Das sähe in deinem Fall ungefähr so aus:
Code: Alles auswählen
if Pos('(**)', Stringname) <> 0 then
mfg Ingo
Re: String Format / Platzhalter abfragen
shokwave hat geschrieben:Das sähe in deinem Fall ungefähr so aus:Code: Alles auswählen
if Pos('(**)', Stringname) <> 0 then
Danke für deine Antwort. Die Platzhalter " * " funktionieren aber nicht, wenn diese durch eine Zahl ersetzt werden.
-
- Beiträge: 470
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: String Format / Platzhalter abfragen
OK, da hatte ich wohl was falsch verstanden. Du meinst innerhalb der Klammer steht immer was anderes? Das bedeutet es gibt nur die öffnende und schließende Klammer als Konstante nach der man suchen könnte. Einen "Platzhalter" für Strings wie in der Kommandozeile, gibt es meines Wissens nicht.
Vielleicht geht es so:
Vielleicht geht es so:
Code: Alles auswählen
//gibt es eine Klammerauf und danach eine Klammerzu?
if Pos('(' , Stringname) < Pos(')' , Stringname) then
mfg Ingo
Re: String Format / Platzhalter abfragen
1.Die Codes die am Anfang in der Klammer stehen müssen sind immer Zahlen von 10-99.
bei "(1)" oder "(999)" darf da ebenfalls nichts passieren.
2. Ich hab außerdem noch das Problem beim speichern in eine Excel Datei
Der String "Ausgabe" wird immer in die ersten Reihe geschrieben, auch wenn das Feld schon beschrieben ist.
Er sollte aber eigentlich die letzte freie Reihe nehmen
3. Wenn ich die EXCEL-Datei geöffnet habe und dabei mit dem Programm diese Anweisung ausführe crasht es.
Gibt es da nicht so eine "try" Anweisung die das beheben könnte?
DANKE!
bei "(1)" oder "(999)" darf da ebenfalls nichts passieren.
2. Ich hab außerdem noch das Problem beim speichern in eine Excel Datei
Code: Alles auswählen
MyWorksheet.WriteCellValueAsString(MyWorksheet.GetLastRowIndex(true),3,Ausgabe);
MyWorkbook.WriteToFile(MyFile,True);
Der String "Ausgabe" wird immer in die ersten Reihe geschrieben, auch wenn das Feld schon beschrieben ist.
Er sollte aber eigentlich die letzte freie Reihe nehmen
3. Wenn ich die EXCEL-Datei geöffnet habe und dabei mit dem Programm diese Anweisung ausführe crasht es.
Gibt es da nicht so eine "try" Anweisung die das beheben könnte?
DANKE!
Re: String Format / Platzhalter abfragen
l0lhaxx hat geschrieben:1.Die Codes die am Anfang in der Klammer stehen müssen sind immer Zahlen von 10-99.
bei "(1)" oder "(999)" darf da ebenfalls nichts passieren.
2. Ich hab außerdem noch das Problem beim speichern in eine Excel DateiCode: Alles auswählen
MyWorksheet.WriteCellValueAsString(MyWorksheet.GetLastRowIndex(true),3,Ausgabe);
MyWorkbook.WriteToFile(MyFile,True);
Der String "Ausgabe" wird immer in die ersten Reihe geschrieben, auch wenn das Feld schon beschrieben ist.
Er sollte aber eigentlich die letzte freie Reihe nehmen
3. Wenn ich die EXCEL-Datei geöffnet habe und dabei mit dem Programm diese Anweisung ausführe crasht es.
Gibt es da nicht so eine "try" Anweisung die das beheben könnte?
Zu 1: Mit regulären Ausdrücken bist du mit der wenigsten Schreibarbeit am Ziel --> google.
Oder, auf die alte Pascal-Tour könnte es auch so gehen (nicht getestet):
Code: Alles auswählen
function IstGueltigerText(s: String): Boolean;
var
i: Integer;
zahl: String;
wert: Integer;
begin
Result := false;
if Length(s) < 3 then
exit;
if (s[1] <> '(' then
exit;
zahl := '';
for i := 2 to Length(s) do begin
if s[i] = ')' then begin
if TryStrToInt(zahl, wert) and ((wert = 1) or (wert = 999) or ((wert >= 10) and (wert <= 99))) then
Result := true;
exit;
end else
zahl := zahl + s[i];
end;
end;
Zu 2: GetLastRowIndex ist der Index der letzten besetzten Zeile (außer wenn das Sheet leer ist, dann ist Index 0 gemeint). Da nachdem du einmal etwas in diese Zeile geschrieben hast - und sonst nirgendwo, bleibt die 0.Zeile natürlich die letzte und du überschreibst immer wieder dieselbe Zelle. Addiere einfach 1 zu GetLastRowIndex, um die nachfolgende (leere) Zeile zu finden.
Zu 3: Diese Beschreibung sagt mir gar nichts... Bitte genauer. Welches Programm, welche Anweisung?
Re: String Format / Platzhalter abfragen
wp_xyz hat geschrieben:Zu 3: Diese Beschreibung sagt mir gar nichts... Bitte genauer. Welches Programm, welche Anweisung?
Wenn ich versuche mit...
Code: Alles auswählen
MyWorksheet.WriteCellValueAsString(Row,2,Ausgabe);
MyWorkbook.WriteToFile(MyFile,True);
...meine EXCEL-Datei zu beschreiben, die aber von mir gesperrt ist (da ich sie bereits geöffnet habe), bekomme
ich einen crash
Code: Alles auswählen
unable to open file "test.xlsx"
Kann man mit FPSpreadsheet eine Abfrage machen ob die Datei bereits geöffnet wurde?
Oder eine try Anweisung?
Code: Alles auswählen
if Code = '11' then begin
try
MyWorksheet.WriteCellValueAsString(Row,0,Ausgabe);
MyWorkbook.WriteToFile(MyFile,True);
Edit2.Text:=Ausgabe;
finally
Fehler.Visible:=True;
Außerdem kommt immer diese Fehlermeldung wenn ich versuche eine Zelle in einem Format als Datum zu schreiben.....
Code: Alles auswählen
MyWorksheet.WriteNumber(Row,0,Ausgabe,nfShortDate,'dd/mm/yyyy');
unit1.pas(122,55) Error: Incompatible type for arg no. 4: Got "TsNumberFormat", expected "FPSTYPES.TsNumberFormat"
Re: String Format / Platzhalter abfragen
Danke für die Erklärung, verstehe jetzt das Problem. Also: Wenn eine andere Anwendung eine Datei geöffnet hält (und das macht Excel), hast du keine Chance, diese Datei zu überschreiben. Aus diesem Grund wirft fpspreadsheet die von dir erwähnte Exception - sie sagt dir, dass die Datei nicht geschrieben werden konnte. Du kannst sie mit try-except abfangen und den Meldungstext ändern, aber das verhindert nicht, dass die Datei nicht geschrieben wird.
Ich gebe zu, dass die Vielzahl von Schreibroutinen verwirrend ist, aber mein Vorgänger hatte strikt zwischen Zahlen und Datums/Zeit-Werten unterschieden. Aus diesem Grund gibt es für das Schreiben einer Datumszelle eine eigene Routine WriteDateTime, die auch die entsprechende Formatanweisung akzeptiert.
Hinter nfShortDate brauchst du keinen eigenen Formatstring mehr anzugeben, dieser ist durch den speziellen Bezeichner nfShortDate bereits definiert (nämlich das, was in den FormatSettings des Workbooks unter ShortDateFormat steht). Der optional angegebene Formatierungsstring wird nur dann ausgewertet, wenn als Formatcode nfCustom oder nfTimeInterval eingetragen sind.
Ich gebe zu, dass die Vielzahl von Schreibroutinen verwirrend ist, aber mein Vorgänger hatte strikt zwischen Zahlen und Datums/Zeit-Werten unterschieden. Aus diesem Grund gibt es für das Schreiben einer Datumszelle eine eigene Routine WriteDateTime, die auch die entsprechende Formatanweisung akzeptiert.
Hinter nfShortDate brauchst du keinen eigenen Formatstring mehr anzugeben, dieser ist durch den speziellen Bezeichner nfShortDate bereits definiert (nämlich das, was in den FormatSettings des Workbooks unter ShortDateFormat steht). Der optional angegebene Formatierungsstring wird nur dann ausgewertet, wenn als Formatcode nfCustom oder nfTimeInterval eingetragen sind.
Re: String Format / Platzhalter abfragen
Ich bekomm es trotzdem nicht gebacken
Code: Alles auswählen
MyWorksheet.WriteDateTime(Row,0,Ausgabe,nfShortDate);
unit1.pas(116,57) Error: Incompatible type for arg no. 4: Got "TsNumberFormat", expected "AnsiString"
Code: Alles auswählen
MyWorksheet.WriteDateTime(Row,0,Ausgabe,nfShortDate,'dd/mm/yyyy');
unit1.pas(116,57) Error: Incompatible type for arg no. 4: Got "TsNumberFormat", expected "FPSTYPES.TsNumberFormat"
Re: String Format / Platzhalter abfragen
Welcher Datentyp ist denn "Ausgabe"? Das muss ein TDateTime sein. Ich denke, du hast einen String --> du musst mit StrToDateTime umwandeln.
[EDIT]
Falls das nicht hilft, solltest du dein Projekt auf den Teil zusammenstreichen, der die Spreadsheet-Datei anlegt, und hier posten, so dass ich mir das näher ansehen kann.
[EDIT]
Falls das nicht hilft, solltest du dein Projekt auf den Teil zusammenstreichen, der die Spreadsheet-Datei anlegt, und hier posten, so dass ich mir das näher ansehen kann.
Re: String Format / Platzhalter abfragen
Daran liegt es leider auch nicht. Kann es sein das die Initialisierung nicht stimmt? Er meckert ja eigentlich über das "nfshortDate".
Code: Alles auswählen
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Clipbrd, StdCtrls, PopupNotifier, fpspreadsheet, fpstypes;
Code: Alles auswählen
procedure TForm1.Edit1EditingDone(Sender: TObject);
type
TsNumberFormat = (
nfGeneral,
nfFixed, nfFixedTh, nfExp, nfPercentage, nfFraction,
nfCurrency, nfCurrencyRed,
nfShortDateTime, nfShortDate, nfLongDate, nfShortTime, nfLongTime,
nfShortTimeAM, nfLongTimeAM, nfDayMonth, nfMonthYear, nfTimeInterval,
nfCustom);
var
laenge, Ende, Row: integer;
Code, Ausgabe, Remember: string;
Re: String Format / Platzhalter abfragen
Warum duplizierst du hier die Deklaration von TsNumberFormat? Das ist dann ein neuer Typ, auch wenn alle Bezeichner gleich sind, und die Routine in fpspreadsheet, die die Deklaration aus fpstypes erwartet, weigert sich diesen Typ anzuerkennen. --> die Deklaration von TsNumberFormat aus EditingDone löschen
Re: String Format / Platzhalter abfragen
wp_xyz hat geschrieben:--> die Deklaration von TsNumberFormat aus EditingDone löschen
...und das Problem ist gelöst. Danke!