[gelöst] String Format / Platzhalter abfragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

[gelöst] String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

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!
Zuletzt geändert von l0lhaxx am Mi 3. Aug 2016, 11:53, insgesamt 1-mal geändert.

shokwave
Beiträge: 475
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

Beitrag von shokwave »

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:

Code: Alles auswählen

if Pos('(**)', Stringname) <> 0 then
mfg Ingo

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

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.

shokwave
Beiträge: 475
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

Beitrag von shokwave »

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:

Code: Alles auswählen

 
//gibt es eine Klammerauf und danach eine Klammerzu?    
if Pos('(' , Stringname) < Pos(')' , Stringname) then
 
mfg Ingo

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

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

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 :evil:

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!

wp_xyz
Beiträge: 5132
Registriert: Fr 8. Apr 2011, 09:01

Re: String Format / Platzhalter abfragen

Beitrag von wp_xyz »

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 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 :evil:

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?

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

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"
 

wp_xyz
Beiträge: 5132
Registriert: Fr 8. Apr 2011, 09:01

Re: String Format / Platzhalter abfragen

Beitrag von wp_xyz »

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.

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

Ich bekomm es trotzdem nicht gebacken :oops:

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"
 

wp_xyz
Beiträge: 5132
Registriert: Fr 8. Apr 2011, 09:01

Re: String Format / Platzhalter abfragen

Beitrag von wp_xyz »

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.

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

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; 
 

wp_xyz
Beiträge: 5132
Registriert: Fr 8. Apr 2011, 09:01

Re: String Format / Platzhalter abfragen

Beitrag von wp_xyz »

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

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: String Format / Platzhalter abfragen

Beitrag von l0lhaxx »

wp_xyz hat geschrieben:--> die Deklaration von TsNumberFormat aus EditingDone löschen
...und das Problem ist gelöst. Danke! :idea:

Antworten